6

这是我的具有属性 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">

当前的验证触发顺序是

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

我想将订单更改为

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

我用谷歌搜索了很多,找不到任何直接的解决方案。请帮我解决一下这个。

4

2 回答 2

9

您可以创建一个继承自 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();
    }
}

要使用您的OrderedAnnotationsModelValidatorProvider,您必须将其注册到 Global.asax.cs 中的 ModelValidatorProviders 的 ModelValidatorProvidersCollection。

ModelValidatorProviders.Providers.Add(new OrderedAnnotationsModelValidatorProvider());
于 2012-11-16T22:59:55.960 回答
0

我尝试了 Jani 给出的解决方案,但由于 GetValidator 是密封的,因此无法编译。

如果您遇到这种情况下需要多次和有序的验证,而不是弯曲框架,您应该简单地创建自己的自定义验证属性。

使用命名参数,您最终可以得到一个非常方便的自定义验证,如下所示:

[NameValidation(isRequired: true, requiredErrorMessage: "Merci de renseigner votre nom.",
malformedErrorMessage: "Votre nom n'est pas valide.", minLength: 1, maxLength: 100)] 
于 2013-06-10T14:54:32.273 回答