这里有两个验证阶段。
在调用属性中设置的验证之前,框架首先尝试解析信息。
因此,这里有几个基于此代码的示例:
[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }
我在框中什么也没输入...
“无效数字”(框架将创建一个空整数,您的验证规则失败)
我在框中输入“A”...
“值“A”对于 Number 无效。” (框架无法将“A”转换为可为 null 的 int,因此框架验证规则失败,并且未检查您的验证规则。
** 解决方案 **
1 - 使用默认消息,直到您使用 MVC 3 / .NET 4,这样可以更轻松地覆盖这些消息
2 - 从绑定器中排除该值,这样就不会导致错误(但您必须绑定它并自己检查)
[Bind(Exclude="MyNumber")]
3 - 将其设为模型上的字符串,然后使用 TryParse 对其进行测试并添加您自己的自定义模型错误(这是合理的做法,并提醒我们所有人为什么使用视图模型而不是域对象!)
if (!Int32.TryParse("MyNumber", out myInteger)) {
ModelState.AddModelError("MyNumber", "That isn't a number!");
}
实际上有很多解决方案,但我建议现在使用选项 3。