我正在玩 EL 验证应用程序块。使用属性进行验证时,不遵守验证顺序。例如:
public class Boat
{
[Display(Name="License Plate")]
[RequiredStringValidator]
[RangeValidator(1,10)]
public String RegistrationNumber
{
get;
set;
}
当我调用以下代码时:
Validator vt = CreateValidator(typeof(Boat), ruleSet);
ValidationResults results = vt.Validate(instance);
结果 [0] - 来自 StringLengthValidator 的错误结果 [1] - 来自RequiredStringValidator(自定义验证器)的错误
问题是顺序并不总是相同的。碰巧RequiredStringValidator 错误位于0 索引位置。似乎 .Net CLR 在使用Attributes.GetCustomAttributes检索它时不保证 Attributes 位置,这就是 VAB 获取属性属性的方式。
在此示例中,如果同一属性有 2 个错误,则应显示第一个属性错误(RequiredStringValidator),但有时会显示 StringLengthValidator 属性错误,因为它停留在 ValidationResults 的第一个位置。
使用 ASP.NET MVC 模型状态时会发生这种情况。
@Html.TextBoxFor(a => a.RegistrationNumber)
@Html.ValidationMessageFor(a => a.RegistrationNumber)
如果出现错误,则仅当RequiredStringValidator验证器具有有效结果时才应出现StringLengthValidator消息。
任何想法?