【发布时间】:2014-04-10 18:50:58
【问题描述】:
我为我的 MVC 项目创建了一个自定义验证属性,以允许我基于动态范围进行验证:
public class DynamicRangeAttribute : ValidationAttribute
{
private readonly double _min;
private readonly double _max;
...
private DynamicRangeAttribute(double? min, double? max, string minProperty, string maxProperty)
{
_min = min ?? (double)GetValue<Decimal>(this, minProperty);
_max = max ?? (double)GetValue<Decimal>(this, maxProperty);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return new RangeAttribute(_min, _max).IsValid(value) ? ValidationResult.Success
: new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
public override string FormatErrorMessage(string name)
{
return string.Format("{0} must be between {1} and {2}", name, _min, _max);
}
...
}
GetValue() 使用反射来查找提供的字段的值。
这里是实现属性的地方:
[Display(Name = @"Chosen Amount")]
[DynamicRange(0, "CurrentBalance")]
public decimal ChosenAmount { get; set; }
验证本身效果很好,但 ErrorMessage 不匹配。理论上,它应该显示(例如)“Chosen Amount must be between 0 and 2500”或任何当前余额。相反,我得到了这个:
这不仅与我的自定义错误消息不匹配,而且与默认的 Range 错误消息也不匹配(另外,请注意它提取的是字段的实际名称而不是 DisplayName)。只是为了测试它,我尝试在 IsValid 方法中手动执行验证(本质上是 return _min ),以防 Range 属性以某种方式覆盖,没有骰子。
我现在唯一的理论是它与我们格式化字段的方式有关:我们使用 javascript 将值屏蔽为货币,因此 2500 变为 $2500.00,而 -5 变为 ($5.00)。我还没有尝试禁用此功能(这是我的下一步),但我希望有人之前可能遇到过此问题并可以提供更好的解决方案。
谢谢,
- 杰西
【问题讨论】:
标签: javascript asp.net-mvc validation custom-attributes