2010-08-10 46 views
2

我在我的类中有一个int属性,并且想验证用户是否输入了字符串。 我怎样才能做到这一点使用数据注释? 当我传递一个非整数值,我得到一个错误时抛出这样的:asp.net mvc int属性绑定异常

The value 'asdasd' is not valid for property. 

例如使用此验证属性:

[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")] 
public int? Number { get; set; } 

和在字段THA输入“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

我正在使用一个字符串,并试图转换为int,但我认为这不是验证此问题的正确方法。 – 2010-08-10 16:48:09

+0

现在发生了什么错?模型联编程序正在验证int就好了。 – jfar 2010-08-10 17:15:13

+0

我认为一个例外可能是你想要的。查看'HandleError'属性。 – 2010-08-10 17:26:37

回答

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测试它,并添加自己的自定义模型误差

if (!Int32.TryParse("MyNumber", out myInteger)) { 
    ModelState.AddModelError("MyNumber", "That isn't a number!"); 
} 
(这是合理的做法,提醒我们为什么视图模型被使用,而不是域对象!)

实际上有很多解决方案,但我会说opti去现在3。

+0

MVC3是否能让Sohnee的解决方案更容易? – batkuip 2011-04-27 01:22:35

0

你可以把一个范围属性在模型场像这样得到这个消息:

[Range(0, 9999)] 
public int Something {get; set;} 

现在每当用户输入SA弦,它就会无法验证,也是INT必须是0-9999

之间,这也应该

[Range(0, 9999)] 
public string Something {get; set;} 

工作
[Range(0, 9999)] 
public object Something {get; set;}