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 に答える