我的View Models应该是什么?

时间:2014-01-20 17:12:30

标签: c# asp.net-mvc asp.net-mvc-4

我有一个名为ProductCategory的商业模式,如下所示我添加了验证:

public class Product
{
    public int ProductId {get; set;}
    [Required]
    [StringLength(25)]
    public string Name {get; set;}
    public string Description {get; set;}
    public int CategoryId {get; set;}
}

public class Category
{
    public int CategoryId {get; set;}
    public string Name {get; set;}
}

对于视图模型,我创建了这样的东西:

public class ProductViewModel
{
    public Product Product {get; set;}
    public IList<Category> Categories  {get; set;}
}

我的一位朋友建议在视图模型中保留所有验证,并在视图模型中映射业务模型的所有属性,如下所示:

public class ProductViewModel
{
    public int ProductId {get; set;}
    [Required]
    [StringLength(25)]
    public string Name {get; set;}
    public string Description {get; set;}
    public int CategoryId {get; set;}
    public IList<SelectListItem> CategoryDropdownValues  {get; set;}
}
我告诉他这种方法对上述方法的好处,他不是很确定。但他坚持认为您不应该直接在您的视图中使用商业模式,并且只应该验证查看模型。

我的问题:

  • 我应该在视图模型或商业模式中保留验证逻辑吗?
  • 让视图模型依赖于商业模式是不是很糟糕?

6 个答案:

答案 0 :(得分:3)

你的朋友是对的。关于你的问题

  1. 有用户输入验证和业务规则验证。大多数情况下,输入验证是业务规则验证的一部分,但是在asp.net mvc中,框架会自动进行验证。为了防止重复,这意味着UI验证应该使用业务验证。这可以通过FluentValidations轻松完成(数据注释过于严格IMO)。

    因此,在这种情况下,使用业务模型验证在UI级别完成UI vlaidation。

  2. 视图模型总是至少在一定程度上取决于商业模式,但不一样。它们是具有不同用途的不同型号,因此它们应保持分离。事实上,您的视图模型与业务(以及数据结构)模型的90%完全相同只是巧合。我们希望将每个模型保留在自己的图层中,只是它们具有相同的属性。

答案 1 :(得分:3)

验证应保持在域/业务级别;否则你会发现自己在整个应用程序中复制了验证规则。这是所有服务和表示层将与之交互的最低标准。

在演示文稿视图模型中使用域模型是一个不同的问题,有利有弊。在您的特定情况下,使用特定于视图的视图模型包装模型可能会减轻您遇到的一些重复。但是,请确保不要像在需要时那样在视图模型中“转储”模型:这会很快损害性能,因为正在加载大量不必要的信息。

ASP.NET MVC框架将正确解析和验证System.ComponentModel.DataAnnotations namespace中的属性。您可以使用这些来注释您的域模型,如果需要,您可以使用仅限于MVC框架的组件来扩充视图模型演示。

答案 2 :(得分:2)

我会在视图模型中保留验证。这就是MVC从中获取元数据的地方。此外,验证属性在MVC程序集中定义。您不希望将MVC依赖项添加到业务逻辑或UI以外的任何其他内容。 UI模型可以依赖于业务模型,但不是相反。我还建议您阅读一些最佳实践文章,例如:http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx

答案 3 :(得分:2)

一般来说,您的UI应该引用视图模型,您的视图模型应该是模型的包装器。模型的工作是为业务对象建模,视图模型的工作是调整该信息,以便在UI中显示。

在我正在处理的代码库中,我们为简单模型多次使用此快捷方式。但是,随着代码的发展,您会发现需要向UI添加新功能,而这些功能对模型本身并没有多大意义。如果你现在不添加那个视图模型,一个天真的程序员肯定会出现,并将UI位直接添加到模型中。

对于验证,我同意您可能希望模型本身;这意味着模型总是经过验证,无论它在何处显示。

但是......可能存在视图模型上应该进行验证的情况:想象一个显示产品列表的视图模型,并包含一个过滤器字段,以便您可以缩小搜索项目的列表范围。如果不允许过滤器,比如说,有“&amp;”其中的字符,然后验证将放在视图模型上,而不是模型。

答案 4 :(得分:1)

  • 应在您的业务层执行验证
  • 不要将业务模型直接暴露给您的UI

那么,如何在UI中验证输入呢? - 是的,您需要使用MVC视图模型上的DataAnnotations属性在某种程度上复制验证。我认为这更适合SRP,因为验证Web输入和验证业务规则不是一回事。

答案 5 :(得分:0)

将验证尽可能保持在最低级别,即类。这就是MVC自动检查验证的方式。