Asp.net mvc 4 asp.net mvc 4模型中验证触发的变更顺序
这是我的模型,属性为OldPasswordAsp.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")]
[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)]