ASP.NET MVC模型与ViewModel

Qco*_*com 87 asp.net-mvc model viewmodel asp.net-mvc-2

好的,我一直听到有关MS的ASP.NET MVC的"ViewModels"的讨论.

现在,这是一种特定的模型,对吗?不是特定的视图.

根据我的理解,它是一种具有与View交互的特定目的的模型?或类似的东西?

一些澄清将不胜感激.

Lor*_*nzo 66

本质上,模型和视图模型都是带有属性的简单类.

这些类的主要目的是描述("模型化")各自受众的对象,分别是控制器和视图.

所以当你说的时候你完全正确

根据我的理解,它是一种具有与View交互的特定目的的Model

因此,虽然Model类实际上是应用程序与之交互的域实体,但View Models是您的视图与之交互的简单类.

希望能帮助到你 :)

更新:

Microsoft已经开发了Martin fowler的专门版本的Presentation Pattern,主要基于模型 - 视图 - 控制器,并称其为PF应用程序的Model-View-ViewModel(MVVM).此模式针对现代UI开发平台,其中UI开发人员对业务逻辑的要求与传统开发人员不同.看看这里的一些理论

  • ViewModel应该将View与(域)模型分开.因此将ViewModel放在View附近而不是Model附近是有意义的. (5认同)

Jas*_*ell 64

用最简单的术语来说,我想考虑以下几点:

型号:严格的外观和感觉就像您的数据模型.对于所有意图和目的,它只是数据模型的类表示.它不了解您的视图或视图中的任何元素.也就是说,它不应包含您将用于View的任何属性装饰器(即;必需,长度等).

视图模型:用作View和模型之间的数据绑定器,在许多情况下,它也是模型的包装器.如果没有View,它将变得无用,因此它通常不能像标准模型那样在多个视图和控制器之间重复使用.

例如,您的Model可能具有以下属性,这些属性是数据源的直接表示:

    public string FirstName { get; set; }
    public string LastName { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在,由于View Model与View相关联,因此它可能具有以下属性 - 它将Model的FirstName字段和LastName字段连接在一起作为一个字符串:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Run Code Online (Sandbox Code Playgroud)

  • 从本质上讲,ViewModel是一个普通的C#对象(PO​​CO),永远不会真正知道您的数据模型是什么样的.它更像是数据模型和视图需要显示的特定元素的混合体.至于如何获取数据,您必须使用数据加载它.我喜欢使用一个单独的中间类,在那里我为数据调用我的服务,然后手动将数据加载到我的ViewModel中.然后我将完全加载的ViewModel返回到控制器操作. (5认同)
  • 你能提供一个更全面的ViewModel例子吗?它是如何知道myModel是什么以及它如何获取myModel的数据? (2认同)

mis*_*dan 26

我发现这篇文章是一个非常有用的资源,用于理解"域模型"和"视图模型"如何在MVC应用程序中进行交互,特别是在绑定方面.最重要的是包括示例而不是抽象描述.

"自从MVC发布以来,我发现很多关于如何最好地构建视图模型的混淆.有时这种混淆并非没有充分的理由,因为似乎没有关于最佳实践建议的大量信息.此外,没有作为银弹的"一刀切"解决方案.在这篇文章中,我将描述一些已经出现的主要模式以及每种模式的优缺点.重要的是要注意这些模式中的许多模式.从解决现实世界问题的人中脱颖而出."

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


Ian*_*cer 19

WikiPedia对模型与模型视图的描述比SO答案更完整:http://en.wikipedia.org/wiki/Model_View_ViewModel

我引用:

模型:与经典MVC模式一样,模型指的是(a)表示真实状态内容的对象模型(面向对象的方法),或(b)表示该内容的数据访问层(数据 -中心方法).

视图:与经典MVC模式一样,视图指的是GUI显示的所有元素,如按钮,窗口,图形和其他控件.

视图模型:在ViewModel是一个"查看模型",也就是说它是也服务于数据的视图和模型之间的结合观的抽象.它可以被视为控制器(在MVC模式中)的一个专门方面,它充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型中.ViewModel公开公共属性,命令和抽象.ViewModel被比作数据的概念状态,而不是模型中数据的真实状态.

  • 虽然有Model和ViewModel的描述,但该链接只是描述MVVM架构模式.不是模型和视图模型之间的差异 (3认同)

tsi*_*mon 5

有一个ViewModel的概念,但它通常不与Asp.net MVC相关联.MVC使用模型视图控制器图案,其中,所述控制器处理的相互作用,从模型构建了数据,然后传送该数据到视图以用于显示.

ViewModel(和Model View ViewModel模式)通常与Silverlight和WPF相关联.Xaml有点不同,因为视图可以对ViewModel进行双向绑定,因此技术有点不同.例如,如果将文本框绑定到字段,则在键入该文本框时,字段的值将动态更新.由于网页是无状态的,因此在网页中实际上不可能进行这种交互.

两种模式的相似之处在于它们都试图将逻辑与显示分开.最常见的用途/原因是测试:您希望能够从代码(通过测试框架)执行用户将通过用户界面调用的所有交互.