2017-10-24 8 views
1

하위 요소의 유효성을 검사하는 사용자 지정 유효성 검사기를 사용하여 모델을 중첩했습니다. 이 접근 방식은 서버 측에서 잘 작동하지만 클라이언트 측 지원도 추가하고 싶습니다. 여기 MVC C#의 클래스 수준 검사기에 클라이언트 유효성 검사를 추가 할 수 있습니까?

public class Customer 
    { 
     public string Name { get; set; } = ""; 

     [AtLeastOneProperty("HomePhone", "WorkPhone", "CellPhone", ErrorMessage = "At least one phone number is required for Customer")] 
     public Phone phone { get; set; } 

     public Customer() 
     { 
      phone = new Phone(); 
     } 
    } 
    public class Phone 
    { 
     public string HomePhone { get; set; } = ""; 

     public string WorkPhone { get; set; } = ""; 

     public string WorkExt { get; set; } = ""; 

     public string CellPhone { get; set; } = ""; 
    } 

내 검사기입니다 : 여기

내 모델입니다

이 코드는 서버 측 유효성 검사 작동
public class AtLeastOnePropertyAttribute : ValidationAttribute, IClientValidatable 
    { 
     private readonly string[] _properties; 
     public AtLeastOnePropertyAttribute(params string[] properties) 
     { 
      _properties = properties; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (_properties == null || _properties.Length < 1) 
      { 
       return null; 
      } 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 

      List<string> props = new List<string>(); 
      props.Add(properties[0].ToString()); 
      foreach (var property in _properties) 
      { 

       validationContext = new ValidationContext(value); 

       var propertyInfo = validationContext.ObjectType.GetProperty(property); 
       if (propertyInfo == null) 
       { 
        return new ValidationResult(string.Format("unknown property {0}", property)); 
       } 

       var propertyValue = propertyInfo.GetValue(validationContext.ObjectInstance, null); 
       if (propertyValue is string && !string.IsNullOrEmpty(propertyValue as string)) 
       { 
        return null; 
       } 

       if (propertyValue != null) 
       { 
        return null; 
       } 
      } 

      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName), props); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      var rule = new ModelClientValidationRule 
      { 
       ErrorMessage = ErrorMessage, 
       ValidationType = "atleastonerequired" 
      }; 
      rule.ValidationParameters["properties"] = string.Join(",", _properties); 

      yield return rule; 
     } 
    } 

그러나, 나는 그것을 위해 클라이언트 측 유효성 검사 눈에 거슬리지 태그를 구축 할 수 없습니다 내가 확인하고있는 것들. 지금은 속성 태그가 개별 속성 대신 중첩 된 모델 속성 위에 있기 때문에 클래스 레벨 Phone 용 태그를 작성하려고합니다.

클라이언트 측 태그를 추가 할 수 있습니까? 어쩌면 유효성 검사 어댑터를 만드는거야?

답변

0

이전에 Expressive Annotations을 사용했습니다. 이것들은 우리가 클라이언트 측과 서버 측에서 트리거 될 수있는 부울 조건을 가진 속성을 지정할 수있게 해줍니다.

+0

나는 표현 어노테이션을 사용했으며 단일 특성에 대해 잘 작동합니다. 예, [Parent-to-Child] (https://github.com/jwaliszko/ExpressiveAnnotations#how-to-handle-validation-based-on-parent-model-field)로가는 방법이 있지만 포함시켜야합니다. 자식 클래스의 부모 TParent 참조 및 부모 클래스의 TChild 참조 내가 위의 코드를 가지고있는 이유는 "자식"클래스를 재사용하는 것이었기 때문입니다. 나는 당신이 자식에게 불리언 속성을 추가하고 RequireIf ("Flag == true")를 확인하는 것이 무엇을 의미하는지 알고 있다고 생각합니다 ... –

+0

Yup은 논리에 기반한 Phone에서 부울을 반환하고 표현식으로 사용합니다. 검증 할. – Viju