2012-03-25 4 views
0

私はカスタム検証を使用しています、それは一つの値のための素晴らしい作品、しかし私は、例えば、複数の値をチェックする必要があります。MVC条件Vallidation RequiredIf

[RequiredIf(「カントリー」、「カナダ」、 "郵便番号が必要です")]
[必須]国、 "米国"、 "郵便番号が必要です"]
パブリック文字列PostalCode {get;セット; }

「RequiredIf」属性が重複しています。 ありがとうございます。

+0

だけ明確にするために - あなたは、エラーメッセージが選択されている国によって異なることがしたいのですが? – nightshifted

+0

プロジェクトのビルド時に重複エラーが発生しました。はい、国によってエラーメッセージが表示されます。おかげで – hncl

答えて

3

同じデータ注釈を1つのプロパティに2回適用することはできません。

現在のRequiredIfAttributeコードがどのように見えるのかわかりませんが、選択した国をチェックし、それに応じてエラーメッセージを調整する別のカスタムバリデーターを作成する必要があります。

public class PostalCodeRequiredAttribute : ValidationAttribute 
{ 
    private const string errorMessage = "{0} is required."; 
    public string CountryPropertyName { get; private set; } 

    public PostalCodeRequiredAttribute(string countryPropertyName) : base(errorMessage) 
    { 
     CountryPropertyName = countryPropertyName; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(errorMessage, name); 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value != null) return ValidationResult.Success; 

     var countryPropertyInfo = validationContext.ObjectType.GetProperty(CountryPropertyName); 
     string country = countryPropertyInfo.GetValue(validationContext.ObjectInstance, null).ToString(); 
     // assuming your country property is bound to a string 

     string name; 

     if (country == "United States") 
      name = "Zip code"; 
     else if (country == "Canada") 
      name = "Postal code"; 
     else 
      return ValidationResult.Success; 
      // assuming postal code not required for all other countries 

     return new ValidationResult(FormatErrorMessage(name)); 
    } 
} 

あなたはあなたの国のプロパティがCountry呼ばれると仮定すると、次のように注釈を付けます:

[PostalCodeRequired("Country")] 
public string PostalCode { get; set; } 
+0

あまりにもありがとう、残念ながら、それは動作しませんでした、ここでは国のプロパティです[必須] public string Country {get;セット; }。あなたは正しい郵便番号が他のすべての国で必要というわけではありません。 – hncl

+0

具体的には機能しなかったものはありますか?コンパイル時にエラーがあったのか、それとも期待通りに検証しなかったのですか?このコードはサーバサイド検証用です。 – nightshifted

+0

私は新しいシンプルなプロジェクトを作り、あなたのモデルを追加しました。問題は私の元のプロジェクトだと思う。どうもありがとうございます。 – hncl