2013-08-01 120 views
0

我使用的是asp.net MVC3,我對這項技術很陌生。模型綁定和驗證錯誤

我的模型的設計方式是,如果數據無效,屬性將拋出驗證錯誤。在這種情況下,屬性不會設置無效數據。

當我重新顯示我的編輯視圖時,顯示驗證錯誤消息;但是用戶以前輸入的值已消失,因爲它綁定的模型只包含舊有效數據。

例如,假設我有一個Person類,並且Name屬性不能爲空或空字符串,否則會引發驗證異常並阻止設置該屬性。現在說用戶從Name屬性中刪除值並嘗試從網絡保存Person。驗證異常將被拋出並正確處理,以將錯誤添加到ModelState,以便將其顯示在屏幕上;然而,Name的舊值會重新顯示,因爲無效的空字符串從未將它置入屬性中。

我不知道如何解決這個問題,任何關於這個問題的建議將不勝感激。

回答

0

解決這個問題的方法是創建一個允許輸入無效數據的ViewModel。這個解決方案也簡化了我的ModelBinder類,因爲它承擔了大部分工作。

1

我的建議是允許無效的數據,但使用驗證屬性。你不會保存無效的實體,所以沒有問題,這是目前的標準方法。如果你不想那樣做,那麼沒有簡單的解決方案。最簡單的解決方案將使用來自Request.Form

+0

我曾多次與我的團隊進行過這次對話。我同意你允許無效數據進入模型,但他們沒有。如果我們已經實現了您的建議設計,那麼在使用這些模型的其他應用程序中驗證會更容易實現。儘管這種設計可以確保我們的模型對象大部分時間都是有效的,但它會導致問題,因爲UI和它所綁定的底層模型不同步。所以,我們有兩個驗證級別:執行的UI驗證和模型驗證。所以,我將不得不找到「不容易」的解決方案。 – Frinavale

0

的信息您應該實現IValidatableObject以在服務器端執行這種驗證。

從MSDN IValidatableObject Interface

提供了一種用於對象將被無效的方法。

這裏例舉一個例子Using IValidatableObject Custom Validation,也來自MSDN。

+0

因此,我的模型具有驗證方法,並且我已經顯示服務器端檢測到的驗證錯誤;但是,舊的價值正在顯示。我在我的問題中添加了一個示例來進一步說明我的問題是什麼...我不確定IValidatableObject接口如何幫助我解決問題? – Frinavale

+0

「我的模型的設計方式是,如果數據無效,屬性將拋出驗證錯誤,在這種情況下,屬性不會設置爲無效數據。」那就是問題,如果模型無效,新的值將永遠不會在模型中設置,那麼只會顯示舊值!這就是爲什麼你應該使用接口 – Fals

+0

執行驗證我必須在這裏丟失一些關鍵。正如你所說,IValidatableObject「提供了一種方法使對象失效。」並有1個方法「驗證」。我通讀了您發佈的示例(演示瞭如何進行自定義驗證);但是,在使用這些數據時,我仍然無法看到舊數據是如何顯示的?我很抱歉,但你能解釋一下這個嗎? – Frinavale