2012-03-05 4 views
5

ComponentModel DataAnnotations를 사용하려면 두 속성 중 하나 이상에 값이 있는지 확인합니다. 내 모델은 다음과 같습니다 : 기본적으로필요 또는 유효성 검사

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

, 내가 BAR1 또는 중 하나 BAR2가 필요되도록 FooModel의 유효성을 검사합니다. 즉, 하나 또는 다른 하나 또는 둘 모두를 입력 할 수 있지만 둘 다 비워 둘 수는 없습니다.

이 방법은 서버 측 및 사용자 쪽 눈에 띄지 않는 서버 쪽에서 모두 효과적입니다.


편집 : 이것은 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.")] 
관련 문제