2011-10-02 31 views
3

在典型的MVC應用程序中,我們驗證了發生在許多不同的地方。它可能在客戶端,在控制器中,然後在數據級別。如果您有業務層,那麼還有其他驗證。如何統一跨層/層的驗證

我們如何統一所有這些,以便我們不違反DRY,並在驗證更改時導致支持噩夢?一個子問題是如何在所有圖層上啓用基於模型的動態驗證。

例如:我們可能有一個具有數據註釋屬性的ViewModel。在MVC2/3中,它統一了客戶端和控制器驗證,但對數據模型沒有幫助(除非將數據模型用作視圖模型,這不是一種好的做法)。

這意味着您必須將相同的驗證添加到數據模型和業務層,並複製它。更重要的是,數據模型可能與視圖模型的驗證要求略有不同(例如,整個數據記錄可能包含多步向導的多個視圖模型,並且只能保存完整的記錄)。

有些人在使用帶有部分類的EF或L2S等ORM時,會將數據模型的複雜驗證添加到數據模型中,但我不確定它是否是正確的路徑。它適用於主要面向數據的應用程序(數據輸入類型的應用程序),但不適用於具有更多非數據業務邏輯的應用程序。

我想要的是一種方法來爲所有圖層生成驗證,或者一種鉤入單個驗證系統的方法。有這樣的事嗎?

+0

也許應該有像Automapper這樣的翻譯層間驗證規則的東西。 – Benjamin

回答

0

我想我真的不明白你的答案,因爲很少你的數據模型,商業模式和視圖模型都一樣。如果是這樣,只需使用數據模型並對其進行驗證即可。所有圖層的驗證都是特定於該圖層的。

示例:如果您更改UI層或創建新層,則您的UI不應包含業務層邏輯。

+2

UI常常* DOES *必須包含業務邏輯。例如,驗證一個字段在兩個參數內。如果您只將該驗證放入數據模型中,則必須往返才能獲取錯誤。如果你只把它放在用戶界面中,那麼你就冒着在服務器端放置不良值的風險。有許多*種類的業務邏輯跨越所有層,特別是在考慮客戶端驗證的情況下。 –

1
+0

Fluent驗證也處理客戶端驗證嗎?編寫純粹是服務器端的驗證並不困難。 –

+0

請參閱http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2 – vrluckyin

+1

對不起,但那是什麼與Fluent驗證有關嗎?這是在談論自定義驗證屬性。如果你必須創建一個自定義驗證屬性來處理客戶端,那麼使用Fluent驗證服務器端,有什麼意義? –