一千萬個為什麽

搜索

使用MVC2進行DRY驗證

我試圖找出如何在我的應用程序中的一個位置定義我的域對象的驗證規則,但是已經遇到了麻煩......

一些背景:我的應用程序有幾個部分: - 數據庫 - DAL - 業務邏輯層 - SOAP API層 - MVC網站

MVC網站通過SOAP API訪問數據庫,就像第三方一樣。我們在MVC網站以及SOAP API層中使用服務器和客戶端驗證。

為避免必須手動編寫客戶端驗證,我們將結合Html.TextBoxFor和Html.ValidationMessageFor HTML幫助程序實現強類型視圖,如步驟3 這裏。我們還為每個表單創建自定義模型,其中一個表單為多個域對象輸入。

This is where the problem begins, the HTML helpers read from the model for the data annotation validation attributes. In most cases our forms deal with multiple domain objects and you can't specify more than one type in the " %> page directive. So we are forced to create a custom model class, which would mean duplicating validation attributes from the domain objects on to the model class.

我花了很長時間尋找解決方法,比如從域類和自定義MVC模型引用相同的MetadataType,但由於以下幾個原因,這不起作用:

  1. 每個類只能指定一個MetadataType屬性,因此如果模型引用多個域對象,每個對象都有自己的元數據類型,則會出現問題。

  2. 如果模型類不包含在引用的MetadataType中指定的屬性,則數據註釋驗證代碼會拋出異常,該屬性是模型的問題,只處理給定域的屬性的子集對象

我也看過其他解決方案,但無濟於事。如果有人對如何實現驗證邏輯的單個源有任何想法,這些驗證邏輯可以在MVC客戶端和服務器端驗證功能以及其他位置(例如我的SOAP API)中工作,我很樂意聽到它!

提前致謝,

馬修

最佳答案

您應該做的不是嘗試在視圖模型中復制結構,而是使用數據模型類中的現有模型。 將表單數據綁定回視圖模型時,可以使用參數上的 [Bind] 屬性限制將綁定哪些列。或者使用任何其他方法來執行此操作。

因此,如果您的模型創建類似 Product UserCategory 的類,並且您的視圖模型需要使用它們的一些屬性,請創建一個類似的視圖模型這個:

public class PageViewModel
{
    public Product Product { get; set; }
    public Category Category { get; set; }
    public User User { get; set; }
}

在您的頁面中,您將能夠使用它們

 m.Product.ProductName) %>

在這種情況下,將根據需要使用實際類中的驗證屬性 這會給你一個可接受的解決方案嗎?

轉載註明原文: 使用MVC2進行DRY驗證