2010-04-03 38 views
5

我掙扎瞭如下兩種最佳實踐起來:ASP.NET MVC 2的驗證使用DTO的,而不是域實體

  1. 使用DataAnnotations + ModelBinding進行驗證在ASP.NET MVC 2
  2. 使用替代的DTO通過視圖模型

傳遞域實體的數據時,如果我要越過的DTO,而不是域的實體,然後利用DataAnnotations + ModelBinding進行驗證會要求我指定我的DTO類屬性驗證。這會導致很多重複的工作,因爲多個DTO可能擁有相同驗證限制的重疊字段。這意味着,只要我更改了域中的驗證規則,就必須找到與該值對應的所有DTO並更新其驗證屬性。

回答

2

您不應該爲每個實體擁有多個DTO,因此您應該只需要爲每個DTO應用一次驗證屬性。如果您需要一個View的多個實體,請將多個DTO包含爲ViewModel的屬性。

+1

這似乎有點限制。如果一個視圖需要一個實體的所有屬性而另一個視圖只需要少數幾個屬性呢?那個用例是不是要求多個DTO? – 2010-04-03 15:06:16

+0

我同意凱文,我可以想到的情況是我會想多個DTOs用於顯示目的。然而,只有一個DTO提交數據將是一個明智的方法。 – roryf 2010-04-03 15:08:42

+0

DTO是您的數據包,ViewModel是混搭的場所。我認爲不同的數據有多個DTO是一個好主意,它會陷入你不希望維護的混亂局面。 – 2010-04-03 16:18:17

1

也許你可以使用元註釋,這使在一個單獨的類屬性:

namespace MvcApplication1.Models 
{ 
    [MetadataType(typeof(MovieMetaData))] 
    public partial class Movie 
    { 
    } 


    public class MovieMetaData 
    { 
     [Required] 
     public object Title { get; set; } 

     [Required] 
     [StringLength(5)] 
     public object Director { get; set; } 


     [DisplayName("Date Released")] 
     [Required] 
     public object DateReleased { get; set; } 
    } 
} 

代碼示例從this article借來的。

+0

雖然我在說這個時可能不正確,但我推薦在DTO類中使用元數據,而不是在外面。正如我在上面的評論中提到的。如果我直接綁定到我的實體框架層上的一個簡單的項目和/或使用流利的API,我會將它們放入元數據類型中。 – jwize 2016-07-26 00:21:49

2

您可能會感興趣this

請記住,驗證無處不在。如果DTO應用UI驗證(如獲取必要的字段填充,日期時間格式正確等)和域對象 - 域驗證(例如,在撤銷操作之前帳戶有錢),沒有任何問題。

您無法創建通用驗證。你可以做的最好的事情 - 把它放在適當的地方。

感覺關於重複的雜草。 DTO的使用通常意味着採用單一責任原則。如果您有兩個客戶對象,其中一個負責承載業務邏輯,另一個負責顯示它,則不會有重複。