Validation ASP.NET MVC3模型验证DataAnnotations使用客户端验证执行小于或等于另一个属性的操作
我有一个简单的表单,它使用ASP.NET MVC 3进行不引人注目的客户端验证 模型看起来有点像这样(为了隐私而更改名称): 在我看来,我在forValidation 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
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;
}
}