2009-05-19 51 views
2

NerdDinner示例中,編寫了一組業務規則以驗證模型上的數據。通過調用modelObject.GetRuleViolations()檢查像空字符串這樣的東西,你可以得到它們全部。但還有另一層驗證是數據庫。例如,datetime字段留給數據庫驗證,數據庫只接受可以轉換成DateTime對象的字符串。如何在ASP.NET MVC的規則違規中獲得數據庫驗證?

我看到的問題是,modelObject.GetRuleViolations()永遠不會返回datetime的違規。因此,即使正確阻止保存記錄,並且顯示錶單並指定有錯誤並突出顯示日期時間字段,也沒有具體的錯誤消息。有沒有辦法在業務規則驗證錯誤中獲取數據庫驗證錯誤?

回答

2

您需要捕獲數據訪問層引發的異常,並將其轉換爲更新ModelState以指示相關錯誤的調用。在全球範圍內執行此操作並不是一個好方法,因爲特定的SQL錯誤只能在調用時解釋,而不是以通用方式處理。

0

我不記得NerdDinner的確切代碼,儘管我已經看過它。然而,在我的應用程序,我通常做在數據庫中RAISERROR(「某些錯誤」,16,1),並在我的控制器/模型中使用一個try/catch像這樣:

public void DoSomething() 
{ 
    try 
    { 
     // Some database activity 
    } 
    catch (SqlException ex) 
    { 
     ViewData["ErrorMessage"] = ex.Message; 
    } 
} 

然後我就可以呈現但我認爲錯誤在我看來。

+2

一般而言,我會非常小心地將異常狀態消息盲目地放入頁面供最終用戶查看,因爲您可能會不經意地提供有關數據庫形狀的非常敏感的信息。 – 2009-05-19 15:28:53

0

你的假設是錯誤的。日期時間字段不用於數據庫驗證。

我不得不在NerdDinner/MVC課程中討論的一件事是驗證將發生在Dinner.cs的OnValidate()部分方法以及調用UpdateModel()的DinnersController.cs中。該調用將屏幕中的文本複製到模型中。例如,如果它試圖將文本複製到浮點數,或者解析和無效日期,它將更新ModelState並引發錯誤。正常的驗證不會運行。