自定义验证属性ASP.NET MVC

时间:2011-03-30 07:06:37

标签: asp.net-mvc

只有在不同的CustomValidationAttribute验证不同的字段时,ASP.NET MVC中是否可以在一个字段上执行CustomValidationAttribute。

我的观点需要包含单独的日期和时间字段。我有两个单独的自定义验证属性。但是,只有在日期验证属性验证为真时才检查时间验证属性吗?

感谢。

1 个答案:

答案 0 :(得分:3)

  

检查时间验证属性   仅在日期验证属性时   验证为真?

此声明表示自定义验证。是的,你可以这样做。您可以定义将其他字段名称作为参数的自定义验证属性。然后,在覆盖的Validate()方法中,您可以通过名称获取该其他字段的PropertyInfo,然后获取验证属性并验证它们。获得结果后,您可以决定是否对第一个字段进行验证。 Brad Wilson在mvcConf上有关于验证的很好的帖子

顺便说一下,您还可以实现IClientValidatable来包装客户端验证

这是非常非常的示例代码,它需要一些参数检查和错误处理等。但我认为想法很明确

 public class OtherFieldDependentCustomValidationAttribute : ValidationAttribute
{
    public readonly string _fieldName;

    public OtherFieldDependentCustomValidationAttribute(string otherFieldName)
    {
        _fieldName = otherFieldName;
    }

    protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext)
    {
        //Get PropertyInfo For The Other Field
        PropertyInfo otherProperty = validationContext.ObjectType.GetProperty(_fieldName);

        //Get ValidationAttribute of that property. the OtherFieldDependentCustomValidationAttribute is sample, it can be replaced by other validation attribute
        OtherFieldDependentCustomValidationAttribute attribute = (OtherFieldDependentCustomValidationAttribute)(otherProperty.GetCustomAttributes(typeof(OtherFieldDependentCustomValidationAttribute), false))[0];

        if (attribute.IsValid(otherProperty.GetValue(validationContext.ObjectInstance, null), validationContext) == ValidationResult.Success)
        {
            //Other Field Is valid, do some custom validation on current field

            //custom validation....

            throw new ValidationException("Other is valid, but this is not");
        }
        else
        {
            //Other Field Is Invalid, do not validate current one
            return ValidationResult.Success;
        }
    }
}