我的类中有一个int属性,想验证用户是否输入了字符串。 如何使用数据注释来做到这一点? 当我传递一个非整数值时,我会得到这样的删除:
The value 'asdasd' is not valid for property.
例如,使用此验证属性:
[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }
并在使用该模型的字段中输入'aaa'我对此消息有所了解:
The value 'aaa' is not valid for Number.
而不是“无效号码”消息。
任何想法?
我已经把
了[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }
但是我从这个消息中得到了这条消息
The value 'aaa' is not valid for Number.
答案 0 :(得分:6)
这里有两个阶段的验证。
在调用属性中的验证设置之前,框架首先尝试解析信息。
以下是基于此代码的几个示例:
[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }
我没有在框中输入任何内容......
“无效数字”(框架将创建一个空整数,您的验证规则失败)
我在框中输入“A”......
“值'A'对数字无效。” (框架无法将“A”转换为可以为空的int,因此框架验证规则失败,并且未检查验证规则。
**解决方案**
1 - 使用默认消息直到您使用MVC 3 / .NET 4,这样可以更轻松地覆盖这些消息
2 - 从活页夹中排除值,因此不会导致错误(但您必须将其绑定并自行检查)
[Bind(Exclude="MyNumber")]
3 - 在模型上创建一个字符串,然后使用TryParse测试它并添加您自己的自定义模型错误(这是一种合理的做法,并提醒我们所有使用View模型而不是Domain Objects的原因!)
if (!Int32.TryParse("MyNumber", out myInteger)) {
ModelState.AddModelError("MyNumber", "That isn't a number!");
}
实际上有很多解决方案,但我现在会说选择3。
答案 1 :(得分:0)
你可以在你的模型字段上放置一个Range属性,如下所示:
[Range(0, 9999)]
public int Something {get; set;}
现在每当用户输入一个字符串时它就不会被验证,并且int也必须在0-9999之间
这也适用于
[Range(0, 9999)]
public string Something {get; set;}
和
[Range(0, 9999)]
public object Something {get; set;}