我的View Models应该是什么?

Rat*_*lad 10 c# asp.net-mvc asp.net-mvc-4

我有一个名为的商业模式Product,并Category像下面我在其中添加了验证:

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;}
}
Run Code Online (Sandbox Code Playgroud)

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

public class ProductViewModel
{
    public Product Product {get; set;}
    public IList<Category> Categories  {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

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

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;}
}
Run Code Online (Sandbox Code Playgroud)

我告诉他这种方法对上述方法的好处,他不是很确定.但他坚持认为,您不应直接在视图中使用商业模式,只应验证查看模型.

我的问题:

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

Mik*_*eSW 3

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

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

    因此,在这种情况下,UI 布局是在 UI 级别上使用业务模型验证完成的。

  2. 视图模型总是至少在一定程度上依赖于业务模型,但两者并不相同。它们是具有不同用途的不同模型,因此应将它们分开。事实上,您的视图模型可能与业务(数据结构)模型 90% 相同,这只是一个巧合。我们希望将每个模型保留在自己的层中,而它们恰好具有相同的属性。