2010-08-10 49 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;}