6

私はを継承して、検証中のSSNの再利用性を向上させようとしています。RegularExpressionAttributeを継承しようとすると、もはや有効になりません

public class FooModel 
{ 
    [RegularExpression(@"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$", ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")] 
    public string Ssn { get; set; } 
} 

、クライアントとサーバー上で正常に検証されます:

は、私は以下のモデルがあります。私は、独自の検証にその長い正規表現をカプセル化したかったので、同様に属性:

public class SsnAttribute : RegularExpressionAttribute 
{ 
    public SsnAttribute() : base(@"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$") 
    { 
     ErrorMessage = "SSN is invalid"; 
    } 
} 

その後、私はそうのように私のFooModelを変更:

public class FooModel 
{ 
    [Ssn(ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")] 
    public string Ssn { get; set; } 
} 

今、検証が邪魔にならず、データが上の属性をレンダリングしません。クライアント。私はそれが本質的に同じものでなければならないように思えるので、理由についてはあまりよく分かりません。

提案がありますか?あなたのApplication_Startクライアント側の検証を放出するための責任を負うことになりますカスタム属性にadapaterを関連付けるために、以下の行を追加して

答えて

13

属性:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(SsnAttribute), 
    typeof(RegularExpressionAttributeAdapter) 
); 

あなたがこれを必要とする理由は、RegularExpressionAttributeが実装されている方法です。 。 IClientValidatableインターフェイスは実装されていませんが、むしろRegularExpressionAttributeAdapterが関連付けられています。

RegularExpressionAttributeから派生したカスタム属性がありますが、クライアントの検証が機能するように属性がIClientValidatableインターフェイスを実装していないか、属性アダプタが関連付けられていません(親クラスとは異なります) 。したがって、SsnAttributeは、IClientValidatableインターフェイスを実装するか、前述の私の答えに関連付けられているアダプタを使用する必要があります。

これは個人的には、このカスタム検証属性の実装にはあまり意味がないと言われています。定数は、この場合には十分かもしれません:

public const string Ssn = @"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$", ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank"; 

、その後:

public class FooModel 
{ 
    [RegularExpression(Ssn, ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")] 
    public string Ssn { get; set; } 
} 

は非常に読みやすいようです。

+2

私の属性はIClientValidatableを実装していました。 'RegularExpressionAttribute'を使うのではなく、このための属性が必要だった理由は、私のプロジェクトに' public const string'正規表現をどこに置くか分かりたくないからです([コンピュータサイエンス...](http://martinfowler.com/bliki/TwoHardThings.html))、また、MVCのメンバーからは、基本的には 'RegularExpressionAttribute'(' PhoneAttribute '、 'EmailAddressAttribute'など)、私は正当化されたと感じました –

関連する問題