如果两个文本框一次验证失败,则ValidationSummary会两次显示相同的消息。
我做错了吗?或者是否有我可以更改的设置以隐藏重复的消息?
我把它分解为最简单的例子:
查看:
@model MyModel
@Html.ValidationSummary()
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)
型号:
public class MyModel : IValidatableObject
{
public int A { get; set; }
public int B { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//Some logic goes here.
yield return new ValidationResult("Validation failed", new[] { "A", "B" });
}
}
结果:
答案 0 :(得分:8)
从ValidationSummary的角度来看,它们并不重复 - 您要将模型状态错误分配给字段A和B,因此验证摘要中必定存在2个错误。它并不“知道”它们是相同的。
简易解决方案:
更难解决的问题:
修改强>
例如:
public static class ValidationExtensions
{
public static MvcHtmlString FilteredValidationSummary(this HtmlHelper html)
{
// do some filtering on html.ViewData.ModelState
return System.Web.Mvc.Html.ValidationExtensions.ValidationSummary(html);
}
}
答案 1 :(得分:2)
重击这是你的观点
<ul class="validation-summary-errors">
@{
string errorMessage = "", previousError = "";
foreach (ModelState modelState in (ViewContext.ViewData.ModelState.Values)){
foreach (ModelError modelError in modelState.Errors)
{
errorMessage = modelError.ErrorMessage;
if (errorMessage != previousError)
{
<li>@modelError.ErrorMessage</li>
previousError = modelError.ErrorMessage;
}
}
}
}
</ul>
你可能能够改进这一点,因为它只在2个连续错误相同的情况下有效,如果它混乱了这可能不起作用的顺序,但这会让你失望。我想你可以构建一个错误消息数组,并在每次运行时检查它的错误,但是这个解决方案似乎在大多数情况下都能正常工作。
答案 2 :(得分:1)
ValidationSummary
方法返回属性级错误和模型级错误。如果您没有指定任何参数,它只会枚举所有验证消息。
您可以: 1)对字段A和B使用不同的消息
// logic here
yield return new ValidationResult("Validation failed for left field", new[] { "A" });
// logic here
yield return new ValidationResult("Validation failed for right field", new[] { "B" });
或者,在您看来
2)将excludePropertyErrors参数设置为true - ValidationSummary(true)
调用ValidationSummary。并在您的每个字段附近拨打Html.ValidationMessage[For]
。
UPDT: ......和第三种情况:
在您的模型中添加公共消息(模型级别):
//logic here
yield return new ValidationResult("Validation failed");
yield return new ValidationResult("any text or empty string", new[] { "A", "B" });
在您的视图中排除属性消息,但不为字段添加ValidationMessage:
@model MyModel
@Html.ValidationSummary(true)
@Html.TextBoxFor(model => model.A)
@Html.TextBoxFor(model => model.B)
所以你会得到单个消息和两个红色框。