2010-04-19 106 views
1

我試圖找出我怎麼能在一個單一的位置定義的驗證規則爲我的域對象我的應用程序中,但已經到了阻礙跑......DRY驗證與MVC2

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

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

爲了避免必須手動編寫客戶端驗證我們正在執行結合Html.TextBoxFor強類型視圖和Html.ValidationMessageFor HTML輔助,如圖步驟3 here。我們還爲每個表單創建自定義模型,其中一個表單爲多個域對象提供輸入。

這是問題開始的地方,HTML助手從模型讀取數據註釋驗證屬性。在大多數情況下,我們的表單處理多個域對象,並且您無法在頁面中指定多個類型... Inherits =「System.Web.Mvc.ViewPage <MvcApplication.Models.SomeModel>」%> page指示。所以我們不得不創建一個自定義模型類,這意味着將驗證屬性從域對象複製到模型類。

我花了相當長的一段時間尋找解決方法,此,這樣的引用了來自域類和自定義MVC模式相同MetadataType,但不會有以下幾個原因工作:

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

  2. 如果模型類不包含在引用的MetadataType中指定的屬性,那麼該模型只處理給定域對象的屬性的子集。

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

由於提前,

馬修

回答

0

你應該做的是什麼,而不是試圖複製在視圖模型的結構,使用現有的模型在數據模型類。 將表單數據綁定回視圖模型時,可以使用參數[Bind]屬性限制將綁定哪些列。或者使用任何其他方法來做到這一點。

所以,如果你的模型創建類,如ProductUserCategory,並且您的視圖模型需要使用它們的一些性質,創建這樣的視圖模型:

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

在你的頁面,你就可以與它們一起使用

<%: Html.EditorFor(m => m.Product.ProductName) %> 

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

+0

這樣做,謝謝! 在你的頭像上有草莓面膜嗎? :) – Matthew 2010-04-24 06:31:32

+0

事實上它是!這是J!NX XD眼鏡的草莓面膜 – 2010-04-24 08:26:53

0

如何返回具有嵌套類型的動作方法的容器類?

http://weblogs.asp.net/blogs/rajbk/image_63B7D5D4.png

+0

我不確定我是否瞭解您的解決方案,請您再解釋一下嗎? 如果我返回一個容器類,那麼我將不得不裝飾具有數據註釋驗證屬性的容器的屬性。 如果我有多個容器適用於引用相同域對象的不同場景,那麼我不必在每個容器上覆制驗證屬性? 謝謝! – Matthew 2010-04-19 07:15:02