Validation ASP.NET MVC3模型验证DataAnnotations使用客户端验证执行小于或等于另一个属性的操作

Validation ASP.NET MVC3模型验证DataAnnotations使用客户端验证执行小于或等于另一个属性的操作,validation,asp.net-mvc-3,data-annotations,Validation,Asp.net Mvc 3,Data Annotations,我有一个简单的表单,它使用ASP.NET MVC 3进行不引人注目的客户端验证 模型看起来有点像这样(为了隐私而更改名称): 在我看来,我在forMaxValueForSize中放置了一个隐藏字段,我想将输入的Size值与MaxValueForSize属性进行比较 我知道我可以通过覆盖以下验证属性在服务器端执行此操作: internal class SizeValidAttribute : ValidationAttribute { protected override Validati

我有一个简单的表单,它使用ASP.NET MVC 3进行不引人注目的客户端验证

模型看起来有点像这样(为了隐私而更改名称):

在我看来,我在for
MaxValueForSize
中放置了一个隐藏字段,我想将输入的
Size
值与
MaxValueForSize
属性进行比较

我知道我可以通过覆盖以下验证属性在服务器端执行此操作:

internal class SizeValidAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if(value != null)
        {
            var model = (MyInputModel) validationContext.ObjectInstance;


            if ((int)value > model.MaxValueForSize)
                return new ValidationResult(ErrorMessage);

        }
        return base.IsValid(value, validationContext);
    }
}
但是,我希望(需要)对此属性进行客户端验证。类似于
Compare
注释的工作方式

有人知道这样做的方法吗?我是否需要以某种方式扩展客户端验证


谢谢你的帮助。

看看这篇文章。它解释了如何扩展ASP.NET MVC模型验证以支持跨域验证:

扩展ASP.NET MVC的验证

Robert Harvey的回答让我走上了正确的道路,但使用ASP.NET MVC3可以使用以下模式简单地覆盖验证:

public class LessThanOrEqualToPropertyAttribute : ValidationAttribute, IClientValidatable
{
    public string OtherProperty { get; set; }

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

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            PropertyInfo propertyInfo = validationContext.ObjectType.GetProperty(OtherProperty);

            var otherValue = propertyInfo.GetGetMethod().Invoke(validationContext.ObjectInstance, null);

            if ((int)otherValue < (int)value)
                return new ValidationResult(ErrorMessage);

        }
        return base.IsValid(value, validationContext);
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "lessthanorequaltoproperty",
            ErrorMessage = FormatErrorMessage(ErrorMessage),
        };

        rule.ValidationParameters.Add("otherproperty", OtherProperty);

        yield return rule;
    }
}
public类lessthanRequalPropertyAttribute:ValidationAttribute,IClientValidable
{
公共字符串OtherProperty{get;set;}
公共覆盖布尔值有效(对象值)
{
返回true;
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
if(值!=null)
{
PropertyInfo PropertyInfo=validationContext.ObjectType.GetProperty(OtherProperty);
var otherValue=propertyInfo.GetGetMethod().Invoke(validationContext.ObjectInstance,null);
如果((int)其他值<(int)值)
返回新的ValidationResult(ErrorMessage);
}
返回base.IsValid(值,validationContext);
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
var规则=新ModelClientValidationRule
{
ValidationType=“lessthanRequalToProperty”,
ErrorMessage=格式ErrorMessage(ErrorMessage),
};
rule.ValidationParameters.Add(“otherproperty”,otherproperty);
收益率-收益率规则;
}
}

从我找到的各种相互冲突的文档中,这一点并不十分清楚。

我知道这已经晚了,但要借助RSL出色的自我回答,唯一真正缺少的是添加一个不引人注目的验证适配器的客户端脚本。这是一个很好的例子。

这个解决方案非常有用。我在MVC2中尝试了它,它成功了,但我必须将模型属性按正确的顺序排列。属性值的设置和运行该属性验证似乎在同一个循环中。如果要访问模型中的另一个属性,则需要将其放在第一位(按行号),以便将其设置在第一位。所以要小心,这是个陷阱!
public class LessThanOrEqualToPropertyAttribute : ValidationAttribute, IClientValidatable
{
    public string OtherProperty { get; set; }

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

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            PropertyInfo propertyInfo = validationContext.ObjectType.GetProperty(OtherProperty);

            var otherValue = propertyInfo.GetGetMethod().Invoke(validationContext.ObjectInstance, null);

            if ((int)otherValue < (int)value)
                return new ValidationResult(ErrorMessage);

        }
        return base.IsValid(value, validationContext);
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "lessthanorequaltoproperty",
            ErrorMessage = FormatErrorMessage(ErrorMessage),
        };

        rule.ValidationParameters.Add("otherproperty", OtherProperty);

        yield return rule;
    }
}