2011-01-08 80 views
2

我正在使用DataAnnotations來驗證使用類頂部的MetadataType標記的自定義類(LINQ to SQL auto generated)。我很喜歡DataAnnotations,它在簡單,常見的場景中運行良好。例如。ASP.Net MVC2使用DataAnnotations以不同的方式驗證相同類的兩個ViewModel

[MetadataType(typeof(Person_Validation))] 
public class Person 

但是如果你需要在不同情況下對班級應用兩套不同的驗證規則呢?

我的情況:某些字段在www面向公衆的網站上是強制性的,但在內部管理網站上不是強制性的。但是這兩個網站都有一個「創建新的」相同對象/類的視圖。

這是它成爲DataAnnotations HELL面..

我一直在使用不同的驗證兩種不同的ViewModels適用於每個人,從人與繼承應用到他們每個人不同的驗證兩類嘗試。但是,所有的道路似乎都與DRY校長髮生衝突,你最終會沿着這條線路完全重新規定基礎班級結構的所有屬性。當您只有一個驗證規則集時,您不必這樣做。因此,對於複雜的物體來說,它很快變得很糟糕而且不實用。

這可能使用DataAnnotations和什麼是最好的DRY體系結構?

回答

1

不確定你的意思是'虛擬複製並手動設置原始基礎類中的每個屬性'。我從來不喜歡好友類的想法,並會親自爲管理員和公共站點推薦不同的視圖模型(每個模型都有相應的驗證集),然後使用AutoMapper在模型之間進行映射。

UPDATE:

Regading Automapper,基本用法是這樣的:

  • 首先你要確定你的映射。這可以讓automapper提前瞭解如何映射對象。您只需在應用程序中執行一次操作,因此在ASP.NET應用程序中執行此操作的好處在Global.asax的Application_Start()中。對於每對要在其間映射類,稱之爲:Mapper.CreateMap<SourceType, DestinationType>();

  • 然後,在應用程序代碼做你只需要使用地圖:

var destinationObject = Mapper.Map<SourceType, DestinationType>(sourceOjbect);

+0

我得出了相同的結論該AutoMapper需要參與,但我希望我錯了。加載「編輯」視圖時會出現問題。你可以讀取id參數,然後在將其傳遞給View之前先獲取需要編輯的對象。此時,您需要以某種方式根據您獲取的對象設置ViewModel中的值。這是所有路徑導致地獄,否則AutoMapper。我可以使用兩個不同的驗證規則集使這個完整的體系結構完美地工作,但是設置檢索到的對象的編輯值是它吹的地方。 – Aaron 2011-01-08 11:14:07

相關問題