假设我有这个 View 模型:
公共(public)类 MyModel
{
[范围(0, 999, ErrorMessage = "无效数量")]
公共(public) int 数量 { 获取;放; }
}
现在,对于此模型的特定实例,有效值的范围将发生变化:有些可能不是 0,有些可能不高于 5。有效范围的最小/最大值来自数据库,并且可以随时更改。
如何即时更改 RangeAttribute 的最小/最大属性?或者验证我的方案的最佳方法是什么?
最佳答案
类似这样的东西可能更适合你的追求......
View 模型:
public class ViewModel
{
public DateTime MinDate {get; set;}
public DateTime MaxDate {get; set;}
[DynamicRange("MinDate", "MaxDate", ErrorMessage = "Value must be between {0} and {1}")]
public DateTime Date{ get; set; }
}
图书馆类或其他地方:
public class DynamicRange : ValidationAttribute, IClientValidatable
{
private readonly string _minPropertyName;
private readonly string _maxPropertyName;
public DynamicRange(string minPropName, string maxPropName)
{
_minPropertyName = minPropName;
_maxPropertyName = maxPropName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var minProperty = validationContext.ObjectType.GetProperty(_minPropertyName);
var maxProperty = validationContext.ObjectType.GetProperty(_maxPropertyName);
if(minProperty == null)
return new ValidationResult(string.Format("Unknown property {0}", _minPropertyName));
if (maxProperty == null)
return new ValidationResult(string.Format("Unknown property {0}", _maxPropertyName));
var minValue = (int) minProperty.GetValue(validationContext.ObjectInstance, null);
var maxValue = (int) maxProperty.GetValue(validationContext.ObjectInstance, null);
var currentValue = (int) value;
if (currentValue <= minValue || currentValue >= maxValue)
{
return new ValidationResult(string.Format(ErrorMessage, minValue, maxValue));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "dynamicrange",
ErrorMessage = ErrorMessage
};
rule.ValidationParameters["minvalueproperty"] = _minPropertyName;
rule.ValidationParameters["maxvalueproperty"] = _maxPropertyName;
yield return rule;
}
发件人:MVC unobtrusive range validation of dynamic values
关于asp.net-mvc - 以编程方式更改验证范围 (MVC3 ASP.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296744/