【问题标题】:Model as a member of ViewModel模型作为 ViewModel 的成员
【发布时间】:2012-06-18 02:42:50
【问题描述】:

我正在尝试更深入地了解 ViewModel,并且我已经阅读了许多关于 MVC 中的 ViewModel 的文章和博客。在一些文章中说不应从 ViewModel 中引用 Model,但在其他一些文章中,建议使用 model 作为 viewmodel 的成员。

让我们举个例子,我必须基于模型创建一个 ViewModel。我可以通过两种方式做到这一点:

1

 public class Car
{
       public int Year {get;set;}
       public string  Make {get;set;}
       //more properties......
}

public class CarViewModel
{
  public CarViewModel(Car model)
  {
    Model = model;
  }

  public Car Model { get; set; }
 //additional view model specific properties
}

或者 2.

public class Car
{
       public int Year {get;set;}
       public string  Make {get;set;}
       //more Car properties......
}

public class CarViewModel
{
       public int Year {get;set;}
       public string  Make {get;set;}
       //more Car properties......

     //additional view model specific properties
}

我只是想知道哪一种是创建 ViewModel 的正确方法。或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: asp.net-mvc mvvm viewmodel


    【解决方案1】:

    Car 模型是数据持久性时,我会选择第二种方法,说它是由实体框架创建的类。在这种情况下,我不希望这些模型在控制器和视图中浮动。我将创建一个与您所做的等效的视图模型,并使用像 AutoMapper 这样的工具来映射属性。

    在第一种方法中,视图模型充当包装器。如果您想在与该模型相关的视图中显示附加信息,则可以使用此功能。假设您必须添加几个 UI 字段,但绝对不应该在 Car 模型中这样做,您必须创建一个包含 Car 模型和其他 UI 字段的视图模型。

    基本上,视图模型可帮助您保持业务模型与 UI 内容无关,并有助于避免模型中的数据库内容浮动在视图和控制器中。因此,您可以根据场景使用两种方法。

    希望这能回答你的问题。

    【讨论】:

    • 谢谢@Mark!我得出的结论是:如果视图需要比模型中包含的更多信息,则创建一个包装 ViewModel,如果视图需要更少的模型属性,则创建一个全新的 ViewModel 类?
    • 还有一点是,当你有实体框架、LinqToSql 等创建的模型时,你应该创建一个视图模型。不使用视图模型,当你直接使用这些类时,你会遇到序列化异常等问题东西因为包含延迟加载/循环引用,所以在这些情况下你也应该使用视图模型。
    • 太棒了!这是有道理的。非常感谢。
    • 您应该查看 AutoMapper 以帮助从模型填充视图模型,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 2012-05-25
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多