使用DTO而不是域实体进行ASP.NET MVC 2验证

时间:2010-04-03 14:52:02

标签: asp.net-mvc validation

我正在努力将两个最佳实践融合在一起:

  1. 在ASP.NET MVC 2中使用DataAnnotations + ModelBinding进行验证
  2. 通过ViewModel
  3. 传递数据时使用DTO而不是域实体

    如果我想要传递DTO而不是域实体,那么利用DataAnnotations + ModelBinding进行验证需要我在DTO类上指定验证属性。由于多个DTO可能会使重叠字段具有相同的验证限制,因此会导致大量重复工作。这意味着每当我更改域中的验证规则时,我都必须找到与该值对应的所有DTO并更新其验证属性。

3 个答案:

答案 0 :(得分:2)

每个实体不应该有多个DTO,因此每个DTO只需要应用一次验证属性。如果您需要View的多个实体,请将多个DTO包含为ViewModel的属性。

答案 1 :(得分:2)

您可能会发现有用的this

请记住,验证无处不在。如果DTO应用UI验证(例如填写必要的字段,正确格式的日期时间等)和域对象 - 域验证(例如帐户在撤销操作之前有钱),则没有任何错误。

您无法创建通用验证。你可以做的最好的事情 - 把它放在适当的地方。

并且感觉到关于重复的感觉。 DTO的使用通常意味着应用单一责任原则。如果您有2个客户对象,其中一个负责承载业务逻辑,第二个负责显示它,则没有重复。

答案 2 :(得分: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