Asp.net-Mvc

ASP.Net MVC 2 驗證是否需要在模式和使用方面進行更多思考?

  • February 20, 2010

這裡是地勢。像大多數人一樣,我有我的領域對象和我的視圖模型。我喜歡使用視圖模型的想法,因為它允許專門為給定的視圖上下文創建模型,而無需更改我的業務對象。

我遇到的問題是在我的域對像上定義類型級別驗證並將這些規則發送給客戶端。在這種情況下,假設我使用數據註釋來描述驗證規則,當我將數據從域對象移動到視圖模型時,視圖模型不再知道它應該讓介面執行什麼驗證(因為驗證是在域對像上定義)。

使用 MVC 2,您可以讓它根據目前對象的驗證規則自動執行客戶端/伺服器端驗證。但是因為驗證規則是在域對象而不是視圖模型上定義的,所以我必須在視圖模型上複製驗證規則才能使其正常工作。

其他人如何處理此類問題?我的想法是除了將域對象的數據映射到視圖模型之外,我們還需要跨驗證規則進行映射,但是我還沒有真正看到其他人談論這個問題…… Brad Wilson 最近談到了這個問題最後,但還沒有真正解決域對象和視圖模型上的規則重複問題……您的想法是什麼?

乾杯安東尼

DataAnnotation 屬性是關於驗證輸入並向最終使用者提供 UI 回饋。這確實是他們唯一的預期用途。我對 UI 對象和業務對象使用不同的驗證策略,因此 DA 驗證屬性最終只出現在向使用者顯示的模型上。

這可能不合適,但是如果您只是將驗證規則/註釋從模型移動到視圖模型怎麼辦?在我參與的一些項目中,我們選擇阻止 View 訪問除通過其相應 ViewModel 公開的資訊之外的任何內容。由於所有數據互動都將通過 ViewModel 執行,因此不需要對 Model 對象進行驗證。

這個論點的反駁是你可以很容易地複制某些驗證規則,因為不同的 ViewModel 可能與相同的 Model 互動。在這種情況下,將您的模型簡單地聲明為在您的 ViewModel 上公開的屬性可能是有意義的。對於回發,他們可以接受一個模型作為他們的參數,允許 ModelBinder 基礎設施來處理請求。在這種情況下,如果 ModelState.IsValid 為 false,您可以在重新顯示視圖之前將屬性重新分配給您的 ViewModel。

我建議將您的註釋移動到您的 ViewModel。這是有道理的,因為很多視圖是 a) 多個模型組合的結果或 b) 模型數據的子集。

引用自:https://stackoverflow.com/questions/2181940