2010-04-03 36 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的使用通常意味着采用单一责任原则。如果您有两个客户对象,其中一个负责承载业务逻辑,另一个负责显示它,则不会有重复。