Asp.net 显示除Fluent验证中定义的错误消息以外的详细错误消息
我使用的是Asp.net 显示除Fluent验证中定义的错误消息以外的详细错误消息,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,fluentvalidation,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Fluentvalidation,我使用的是ASP.NET MVC 4和最新版本的Fluent Validation。我在数据注释上使用流畅的验证 我正在考虑将验证错误摘要添加到要输入数据的视图中。我目前只对每个输入字段使用ValidationMessageFor。有时,我需要在表单验证为true之后执行其他验证(如针对服务),然后在验证失败时在视图上显示这些消息。由于此验证与任何输入字段都不相关,我希望在验证错误摘要中显示此错误 以“我的员工编号”字段为例,它是必填字段,长度不能超过10个字符。我有以下使用Fluent验证的验
ASP.NET MVC 4
和最新版本的Fluent Validation
。我在数据注释上使用流畅的验证
我正在考虑将验证错误摘要添加到要输入数据的视图中。我目前只对每个输入字段使用ValidationMessageFor
。有时,我需要在表单验证为true之后执行其他验证(如针对服务),然后在验证失败时在视图上显示这些消息。由于此验证与任何输入字段都不相关,我希望在验证错误摘要中显示此错误
以“我的员工编号”字段为例,它是必填字段,长度不能超过10个字符。我有以下使用Fluent验证的验证程序类:
public class CreateEmployeeViewModelValidator : AbstractValidator<CreateEmployeeViewModel>
{
public CreateEmployeeViewModelValidator()
{
RuleFor(x => x.EmployeeNumber)
.NotEmpty()
.WithMessage("Required")
.Length(1, 10)
.WithMessage("Must not be greater than 10 characters");
}
}
这部分很好用。如果文本框为空,则在文本框旁边显示“必需”错误消息;如果文本框超过10个字符,则显示“不得超过10个字符”错误消息
现在我想将我的验证错误摘要添加到视图中。我补充说:
@Html.ValidationSummary(true, "Errors have occurred while. Fix the errors before saving.")
我想它显示一些体面的错误信息有关的控制上面。虽然如果员工编号为空,它会在员工编号旁边显示“Required”,但我希望它在验证错误摘要中显示类似“employee number is Required”的内容。当前,它只显示文本“错误已发生,请在保存前修复错误。”
当我需要在表单验证为true之后进行其他验证时,比如检查员工是否是有效员工,那么我也希望显示此错误消息。如果我的控制器的动作方法中有此项:
ModelState.AddModelError("", "My test error message");
我希望在验证错误摘要中显示“我的测试错误消息”
这样的事情怎么可能呢?您应该这样设置它
@Html.ValidationSummary(false)
假设您没有在客户端进行验证,或者验证失败,当您提交表单时,您的控制器中有这些错误。然后,您可以像现在添加错误一样添加更多错误:
ModelState.AddModelError("", "My test error message");
当视图被渲染回客户端时,它将包含来自模型属性的错误消息以及自定义消息
更新:
Brendan提到,他希望在每个错误控件之外显示一条短消息,并为同一个错误控件提供更长版本的错误消息,并在ValidationSummary中显示更长版本的错误消息。这可以通过一点技巧来完成
假设模型有一个名为EmployeeNumber
的属性,如问题所示。表单被提交回来,并在服务器端使用Brendan设置的自定义验证器进行验证。一切都很好。现在,我们可以使用反射并检查模型的属性,发现modelstate字典中是否存在错误,使用属性名称并在某个错误集合对象中查找它(可以是资源文件或数据库,所有方法都是一样的)
现在,通过执行以下操作,确保从摘要中排除属性错误:
@Html.ValidationSummary(true)
因此,现在除了错误控件和摘要中的(非常)长的错误消息之外,您还可以享受一个简短的错误。@Html.ValidationSummary(true)-->Correct
ModelState.addmodeleror(“,”此帐户未在我们的系统中注册。“)代码>
这应该已经奏效了。那么,附加的错误消息没有显示在摘要中吗?它显示的是来自控制器的错误消息,但如果表单验证为false,我将尝试将详细的错误消息获取到验证摘要中。这样做将在摘要中显示“必需”。“Required”没有任何含义,我希望在摘要中显示一条描述性错误消息,如“Employee number is Required”。控件旁边的“Required”是可以的。修改验证器是一个选项吗?像这样:
.WithMessage(“需要员工号码”)
?如果是这样的话,那就行了。如果没有,那么我很抱歉我的回答是不够的。是的,这样就可以了,但我不希望在我的控制下有这么长的消息。我可以。一定有办法做到这一点:)你的答案是可以的。如果做不到这一点,那就不是世界末日。啊,我想我更明白你想做什么。这是可以做到的,但需要一点技巧。您可以做的是读取modelstatedictionary,然后查找字段是否有错误。然后提供该错误的较长版本,将其作为自定义错误添加。然后使用validationsummary排除属性错误(@html.validationsummary(true)
)。
[HttpPost]
public ActionResult AcceptEmployee(EmployeeModel model)
{
// customErrors here is a dictionary
// that contains information for the custom message
// i.e. Key="EmployeeNumber", Message="Employee number is required"
// like I've mentioned this can be a query from the database
// or a get from a resource file
// for the sake of this example, I used a dictionary
foreach (var property in model.GetType().GetProperties())
{
if (ModelState[property.Name] !=null
&& ModelState[property.Name].Errors.Any())
{
ModelState.AddModelError("", customErrors[property.Name]);
}
}
}
@Html.ValidationSummary(true)