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 용 태그를 작성하려고합니다.
클라이언트 측 태그를 추가 할 수 있습니까? 어쩌면 유효성 검사 어댑터를 만드는거야?
나는 표현 어노테이션을 사용했으며 단일 특성에 대해 잘 작동합니다. 예, [Parent-to-Child] (https://github.com/jwaliszko/ExpressiveAnnotations#how-to-handle-validation-based-on-parent-model-field)로가는 방법이 있지만 포함시켜야합니다. 자식 클래스의 부모 TParent 참조 및 부모 클래스의 TChild 참조 내가 위의 코드를 가지고있는 이유는 "자식"클래스를 재사용하는 것이었기 때문입니다. 나는 당신이 자식에게 불리언 속성을 추가하고 RequireIf ("Flag == true")를 확인하는 것이 무엇을 의미하는지 알고 있다고 생각합니다 ... –
Yup은 논리에 기반한 Phone에서 부울을 반환하고 표현식으로 사용합니다. 검증 할. – Viju