Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC 2与MVC 3使用DataAnnotationsModelValidatorProvider.RegisterAdapter的自定义验证属性_Asp.net Mvc_Asp.net Mvc 3_Validation_Asp.net Mvc 2 - Fatal编程技术网

Asp.net mvc MVC 2与MVC 3使用DataAnnotationsModelValidatorProvider.RegisterAdapter的自定义验证属性

Asp.net mvc MVC 2与MVC 3使用DataAnnotationsModelValidatorProvider.RegisterAdapter的自定义验证属性,asp.net-mvc,asp.net-mvc-3,validation,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 3,Validation,Asp.net Mvc 2,我读了一些帖子,但现在找不到了,因为在MVC3中,实际上不需要创建验证器,只需要属性。这是真的吗?我要说的是,我发现属性上有iclientvalidable这一点令人困惑。那么,如果注释具有客户端脚本名称(IClientValidatable),并且能够进行验证(ValidationAttribute是有效的),DataAnnotationsModelValidator类会做什么呢 如果我不必在全局数据库中向验证器注册属性,那就太好了。这能做到吗?我读过一些不好的建议吗 编辑:有趣的是,我刚刚通

我读了一些帖子,但现在找不到了,因为在MVC3中,实际上不需要创建验证器,只需要属性。这是真的吗?我要说的是,我发现属性上有iclientvalidable这一点令人困惑。那么,如果注释具有客户端脚本名称(IClientValidatable),并且能够进行验证(ValidationAttribute是有效的),DataAnnotationsModelValidator类会做什么呢

如果我不必在全局数据库中向验证器注册属性,那就太好了。这能做到吗?我读过一些不好的建议吗

编辑:有趣的是,我刚刚通过排除验证器对其进行了测试,将所有逻辑都放在了IsValid中,效果非常好。我想唯一可能缺少的是控制器上下文,但我不确定这在验证中是否有用。IsValid具有ValidationContext,如果我需要服务,它具有ServiceContainer。我在这里没有发现任何真正的缺点

编辑2: 我将从以下示例中的验证器开始:

属性:

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 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;
    }

    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, ControllerContext context)
    {
        ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule()
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "requiredifattribute"
        };
        modelClientValidationRule.ValidationParameters.Add("requiredifattribute", DependentProperty);
        yield return modelClientValidationRule;
    }
}
公共类requireditAttribute:ValidationAttribute,IClientValidable
{
私有RequiredAttribute innerAttribute=新RequiredAttribute();
公共字符串依赖属性{get;set;}
公共对象TargetValue{get;set;}
public requirediftAttribute(字符串相关属性,对象targetValue)
{
this.DependentProperty=DependentProperty;
this.TargetValue=TargetValue;
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
var field=validationContext.ObjectInstance.GetType().GetProperty(DependentProperty);
如果(字段!=null)
{
var dependentValue=field.GetValue(validationContext.ObjectInstance,null);
if((dependentValue==null&&TargetValue==null)||
(dependentValue.Equals(TargetValue)))
{
如果(!innerAttribute.IsValid(值))
返回新的ValidationResult(ErrorMessage);
}
}
返回ValidationResult.Success;
}
public System.Collections.Generic.IEnumerable GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)
{
ModelClientValidationRule ModelClientValidationRule=新ModelClientValidationRule()
{
ErrorMessage=FormatErrorMessage(metadata.DisplayName),
ValidationType=“RequirediftAttribute”
};
modelClientValidationRule.ValidationParameters.Add(“RequirediftAttribute”,DependentProperty);
收益返回模型ClientValidationRule;
}
}
最后一位代码替换所有其他代码是否有问题?为什么我要保留validator类?

CrazyDart

MVC3中添加了
IClientValidable
接口

第二个示例显示了此新接口的有效使用。您是正确的,它不必注册,它将提供必要的客户端验证规则,以及进行必要的服务器端验证

去吧,享受它


CouncellorBen

当我使用CrazyDart的最后一个选项时,服务器端部分在MVC4中工作得非常好

但我无法让客户端验证正常工作。它从不在客户端检查必填字段(尽管添加了一些标记)

我还查看了西蒙·因斯的第二篇博文(第一篇是海报的灵感):

你在哪里读到这条建议的?我希望能找到,但我找不到。这更多的是对某人帖子的评论。你怎么看?目前我什么都不想,因为我仍在试图理解问题是什么。我只是希望看到更多的上下文,特定的代码示例,等等,这就是为什么我要求提供源代码,以便尝试看到更多的上下文,因为您在问题中没有提供足够的内容。希望您能提供一些具体的代码示例来说明您遇到的问题。当然,我现在会输入一些代码。现在我是一个白痴,但是有人能解释一下上面的代码吗。。。特别是第二部分。我知道他在这里写了一个属性。。。一个必需的If属性,但它是如何工作的呢?事实证明你是正确的。我将使用IClientValidable,这样做时我会看起来很好。;-)根据我对IClientValidable的理解,我认为IClientValidable仍然需要为jquery验证适配器和验证方法添加客户端脚本。
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute), typeof(RequiredIfValidator));
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;
    }

    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, ControllerContext context)
    {
        ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule()
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "requiredifattribute"
        };
        modelClientValidationRule.ValidationParameters.Add("requiredifattribute", DependentProperty);
        yield return modelClientValidationRule;
    }
}