0

我正在玩 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消息。

任何想法?

4

1 回答 1

0

只需订购结果:

var results = (
    from result in vt.Validate(instance)
    orderby result.Validator.GetType()
    select result)
    .ToArray();
于 2012-11-23T18:09:39.550 回答