2012-03-05 8 views
5

ComponentModelを使用したいDataAnnotationsは、2つのプロパティの少なくとも1つに値があることを検証します。私のモデルは次のようになります。基本的にはいずれかまたは必須の検証

public class FooModel { 
    public string Bar1 { get; set; } 
    public int Bar2 { get; set; } 
} 

私はBAR1 または BAR2がを必要とするいずれかのようにFooModelを検証します。つまり、どちらか一方、または両方を入力することはできますが、両方を空にすることはできません。

これは、サーバー側と控えめなクライアント側の検証の両方で機能することをお勧めします。


EDIT:これはpossible duplicate, as this looks similar to what I'm looking to do

+2

右カスタムバリデータのここにあなたの友達です。 – veblock

+1

問題を解決するためのRequiredIfというカスタムバリデーターがあります。 – Joe

+0

@JoeTuskan、そうです、[このブログの記事](http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc)が見つかりました-3.aspx)を参考にして、問題を解決します。私があなたに信用を与えることができるように答えを入力したいのであれば、それは私のものです。そうでなければ、私の+1をしてください。 –

答えて

4

あなたはValidationAttributeクラスを拡張し、オーバーisValidメソッドに乗ると、あなたが検証を行うために、カスタムJavaScriptを圧送するようにしたい場合はIClientValidatableを実装する必要があるだろうことがあります。以下のようなものです。

[AttributeUsage(AttributeTargets.Property)] 
    public sealed class AtLeastOneOrTwoParamsHasValue : ValidationAttribute, IClientValidatable 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var param1 = validationContext.ObjectInstance.GetType().GetProperty("Param1").GetValue(value, null); 
      //var param2 = validationContext.ObjectInstance.GetType().GetProperty("Param2").GetValue(value, null); 

      //DO Compare logic here. 

      if (!string.IsNullOrEmpty(Convert.ToString(param1))) 
      { 
       return ValidationResult.Success; 
      } 


      return new ValidationResult("Some Error"); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      //Do custom client side validation hook up 

      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
       ValidationType = "validParam" 
      }; 
     } 
    } 

使用法:

[AtLeastOneOrTwoParamsHasValue(ErrorMessage="Atleast one param must be specified.")] 
関連する問題