2010-11-10 41 views
2

我正在使用實體框架+ SQL Server數據庫,並使用DataAnnotations部分類來驗證數據。對於像Required和Range這樣的東西,這可以正常工作,但我無法使DataType驗證器正常工作。MVC2:使用DataAnnotations來驗證數據類型

這裏是(自定義)註釋的例子:

[DataTypeWholeNumberAttribute(ErrorMessage = "Zip must be a whole number")] 
public object Zip{ get; set; } 

...和控制器代碼...

[HttpPost] 
public ActionResult Edit(NamedInsuredViewModel viewModel) 
{ 
    try 
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null 
     if (ModelState.IsValid) 
     ...save, etc... 
    } 
} 

而且我知道發生了什麼:郵編中的數據類型數據庫是int,因此默認驗證正在捕獲,並且在我的驗證器可以到達之前應用通用錯誤消息「value [x]對[FieldName]無效」(爲了證明這一點,我還添加了相同的驗證器到一個字符串字段,它工作得很好)。我不知道的是,我怎麼能解決這個問題(不,我不能改變數據庫使用字符串的一切)?

在這篇文章中提供了一些建議(http://forums.asp.net/p/1608322/4162819.aspx#4162819),但到目前爲止沒有任何幫助。

在此先感謝。

PS - 是否真的沒有辦法驗證原始數據類型而不創建自定義屬性?

+1

爲什麼Zip是一個對象?爲什麼它不是一個整數? – jfar 2010-11-10 16:45:35

回答

0

我認爲錯誤是將一些名爲「viewModel」的東西傳遞給Edit Action。 ViewModel用於將數據傳遞給視圖來呈現它。 提交表單時,數據必須映射到實體而不是viewModel。

[HttpPost] 
public ActionResult Edit(YourEntity entity) 
{ 
    try 
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null 
     if (ModelState.IsValid) 
     ...save, etc... 
    } 
} 
0

將您的自定義驗證器應用到課程中。然後將你的類實例作爲驗證器的參數傳入,而不是字符串。然後,您可以對相應的屬性執行驗證,而不考慮類型。