asp.net-mvc – MVC 2 vs MVC 3自定义验证属性使用DataAnnotationsModelValidatorProvider.RegisterAdapter

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – MVC 2 vs MVC 3自定义验证属性使用DataAnnotationsModelValidatorProvider.RegisterAdapter前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我读了一些帖子,但现在不能发现,在MVC 3中,创建验证器并不是真正需要的,只是属性.这是真的?我说我觉得这个属性有它的IClientValidatable,令人困惑.那么如果注释具有客户端脚本名称(IClientValidatable)和验证(ValidationAttribute IsValid)的能力,DataAnnotationsModelValidator类将执行什么操作?

如果我没有在全局中注册与验证器的属性,这将是非常好的.这可以做吗我读了一些不好的建议吗?

编辑:有趣的是,我只是通过排除验证器来测试它,将所有的逻辑放在IsValid中,并且它的效果很好.我猜,唯一可能会丢失的是控制器上下文,但我不确定这在验证中是有用的.如果需要服务,IsValid有ValidationContext,它具有ServiceContainer.任何真正的劣势,我不会在这里拿起来?

编辑2:
我将从这个例子开始一个验证器:http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx

属性

public class requiredIfAttribute : ValidationAttribute,IClientValidatable
{
    private requiredAttribute innerAttribute = new requiredAttribute();
    public string DependentProperty { get; set; }
    public object TargetValue { get; set; }

    public requiredIfAttribute(string dependentProperty,object targetValue)
    {
        this.DependentProperty = dependentProperty;
        this.TargetValue = targetValue;
    }

    public override bool IsValid(object value)
    {
        return innerAttribute.IsValid(value);
    }

    public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata Metadata,ControllerContext context)
    {
        ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule()
        {
            ErrorMessage = FormatErrorMessage(Metadata.DisplayName),ValidationType = "requiredifattribute"
        };
        modelClientValidationRule.ValidationParameters.Add("requiredifattribute",DependentProperty);
        yield return modelClientValidationRule;
    }
}

验证者:

public class requiredIfValidator : DataAnnotationsModelValidator<requiredIfAttribute>
{
    public requiredIfValidator(ModelMetadata Metadata,ControllerContext context,requiredIfAttribute attribute)
        : base(Metadata,context,attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return base.GetClientValidationRules();
    }

    public override IEnumerable<ModelValidationResult> Validate(object container)
    {
        var field = Metadata.ContainerType.GetProperty(Attribute.DependentProperty);
        if (field != null)
        {
            var value = field.GetValue(container,null);
            if ((value == null && Attribute.TargetValue == null) ||
                (value.Equals(Attribute.TargetValue)))
            {
                if (!Attribute.IsValid(Metadata.Model))
                    yield return new ModelValidationResult { Message = ErrorMessage };
            }
        }
    }
}

使用上面的代码,我需要在Global.asax.cs文件注册

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(requiredIfAttribute),typeof(requiredIfValidator));

但是,如果我把所有内容都移动到属性中,我不必注册它:

public class requiredIfAttribute : ValidationAttribute,object targetValue)
    {
        this.DependentProperty = dependentProperty;
        this.TargetValue = targetValue;
    }

    protected override ValidationResult IsValid(object value,ValidationContext validationContext)
    {
        var field = validationContext.ObjectInstance.GetType().GetProperty(DependentProperty);
        if (field != null)
        {
            var dependentValue = field.GetValue(validationContext.ObjectInstance,null);
            if ((dependentValue == null && TargetValue == null) ||
                (dependentValue.Equals(TargetValue)))
            {
                if (!innerAttribute.IsValid(value))
                    return new ValidationResult(ErrorMessage);
            }
        }
        return ValidationResult.Success;
    }

    public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata Metadata,DependentProperty);
        yield return modelClientValidationRule;
    }
}

最后一位代码替换所有其他代码是否有问题?为什么要保留验证器类?

解决方法

CrazyDart,

在MVC3中添加了IClientValidatable界面.

第二个例子显示了这个新界面的有效使用.您没有必要注册是正确的,它将提供必要的客户端验证规则,以及进行必要的服务器端验证.

去吧,享受吧.

counsellorben

猜你在找的asp.Net相关文章