2012-04-25 9 views
1

私の複数の国のサイトでは、私は住所作成のためのフォームを持っています。国ごとにバリデーションルールをカスタマイズしたい(例:FR ZipCode length 8、USA:10 ...)、私は多くのソリューションの間に躊躇しています:ViewModel by Country、Parameterizedアノテーション、DataFilter ...複数の国の妥当性確認のルール

public class Address 
{ 
    [Required] 
    public string Name { get; set; } 
    [StringLength(lengthByCountry)] 
    public string ZipCode { get; set; } 
} 

答えて

1

あなたは国によってZIPコードの国固有の検証を行い、独自のバリデータを書き込むためにCustomValidationAttributeを使用することができます。

+0

with CustomValidationAttribute手動でクライアント側の検証を行う必要がありますか? – rad

+0

@rad: 'CustomValidationAttribute'は、バリデーションフレームワークにプラグインし、文字列の長さをチェックする以外の何かを行う独自のバリデーターを書くか、正規表現を使用します。これは「手動」作業ですが、コード内で検証メソッドを呼び出す必要はありません。 'StringLengthAttribute'を使用するときに文字列長チェックを呼び出す必要はありません。 –

1

同じ提出の中で国と郵便番号を指定する必要がある場合は、モデルにIValidatableObjectを実装して、値の組み合わせに基づいて検証できるようにすることをおすすめします。

public class Address : IValidatableObject 
{ 
    [Required] 
    public string Name { get; set; } 

    public string Country { get; set; } 

    public string ZipCode { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 

     var results = new List<ValidationResult>(); 

     switch (Country) 
     { 
      case "France": 
       if (ZipCode.Length < 8) 
        results.Add(
         new ValidationResult("French zip codes must be at least 8 characters", new List<string> { "ZipCode" }) 
        ); 
       break; 

      case "U.S.": 
       if (ZipCode.Length < 10) 
        results.Add(
         new ValidationResult("American zip codes must be at least 10 characters", new List<string> { "ZipCode" }) 
        ); 
       break; 

      // Etc. 
     } 

     return results; 

    } 

} 
+0

IValidateableObjectを提案しているほとんどの人がなぜクライアント側の検証をしないのかについて言及していないのはなぜか分かりません。これは多くの場合、完全に受け入れられる解決策ですが、検証ワークフローに不思議が生じる可能性があることを知る必要があります。 –

関連する問題