Asp.net mvc 4 asp.net mvc 4模型中验证触发的变更顺序

Asp.net mvc 4 asp.net mvc 4模型中验证触发的变更顺序,asp.net-mvc-4,client-side-validation,validation,Asp.net Mvc 4,Client Side Validation,Validation,这是我的模型,属性为OldPassword [Required] [StringLength(16, ErrorMessage = "The Old Password must be at least 8 characters long.", MinimumLength = 8)] [RegularExpression("^(?=.*[a-z])(?=.*[A-Z]).+$", ErrorMessage = "Old Password is Not a valid Password")]

这是我的模型,属性为OldPassword

 [Required]
 [StringLength(16, ErrorMessage = "The Old Password must be at least 8 characters long.", MinimumLength = 8)]
 [RegularExpression("^(?=.*[a-z])(?=.*[A-Z]).+$", ErrorMessage = "Old Password is Not a valid Password")]
 [Display(Name = "Old Password")]
 public string OldPassword { get; set; }
这是渲染输出

<input class="inputsmall defaultFocus input-validation-error" data-val="true" 
data-val-length="The Old Password must be at least 8 characters long." 
data-val-length-max="16" data-val-length-min="8" 
data-val-regex="Old Password is Not a valid Password" 
data-val-regex-pattern="^(?=.*[a-z])(?=.*[A-Z]).+$" 
data-val-required="The Old Password field is required." id="OldPassword" maxlength="16" name="OldPassword" style="width: 295px;" type="password">

验证激发的当前顺序为

  • 必需的
  • 正则表达式
  • 长度
我想把订单改为

  • 必需的
  • 长度
  • 正则表达式

我在谷歌上搜索了很多,找不到任何直接的解决方案。请帮助我。

您可以创建一个自定义类,该类继承自DataAnnotationsModelValidatorProvider,覆盖其中的GetValidators方法,并将其注册为您的ModelValidator。在重写的方法中,您可以根据需要对验证器进行排序

public class OrderedAnnotationsModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
    {
        return base.GetValidators(metadata, context).OrderBy(v => v.SomeProperty).AsEnumerable();
    }
}

我尝试了Jani给出的解决方案,但它无法编译,因为GetValidator是密封的

如果遇到这种情况,需要进行多个有序的验证,而不是弯曲框架,那么只需创建自己的自定义验证属性即可

使用namedparameters,您可能会得到一个非常方便的自定义验证结果,如下所示:

[NameValidation(isRequired: true, requiredErrorMessage: "Merci de renseigner votre nom.",
malformedErrorMessage: "Votre nom n'est pas valide.", minLength: 1, maxLength: 100)] 

我认为这根本不可能。也许改变定义的顺序可能会影响,但这是不可靠的。我认为您最好联系作者,将此作为对未来版本的请求。GetValidators是一个密封类:(此重载不是密封的
GetValidators(ModelMetadata元数据、ControllerContext上下文、IEnumerable属性)
[NameValidation(isRequired: true, requiredErrorMessage: "Merci de renseigner votre nom.",
malformedErrorMessage: "Votre nom n'est pas valide.", minLength: 1, maxLength: 100)]