2012-06-26 53 views
9

我一直在研究asp.net MVC项目结构的一个新项目,并有一个问题让我感到困惑。模型和视图模型有什么区别?我在说视图模型包含表单属性中的模型时是否正确?模型和视图模型之间的差异

+0

你可能已经google了。 SO本身有很多问题注册。这个主题。 – VJAI

+1

This SO Question- http://stackoverflow.com/questions/4061440/asp-net-mvc-model-vs-viewmodel,完美地回答了这个问题。 – Bibhu

回答

28

我有一个博客,我想显示在一个视图中的最新的帖子最新评论日志分类名单。我该怎么做?我可以强烈地将我的观点输入到任何一个模型中?有查看模型

我创建了一个名为BlogViewModel的视图模型,其中包含最新的帖子,最新的评论和其他东西作为属性,我绑定我的视图与这个模型。 posts,comments ..都是域模型BlogViewModel查看模型我专门为视图创建的。

明天我会在移动版本中显示我的博客,那时我可能会创建一个只包含较少属性的简单视图模型。最后,视图模型是用于视图和大部分时间,它们充当真实域模型的包装器!

4

ViewModel是从调整到特定视图的业务域图层中的模型的版本。

它只有与视图相关的属性,不应该有方法(除了简单的像ToString())。

ViewModel只是一个“数据容器”。

2

模型仅仅是应用程序中对象的表示形式。但是,您应该了解几种不同类型的模型。

  1. 域模型:如果您使用的是ORM(Linq2SQL,EF),则表示应用程序中的域对象,如SQL表。

  2. 查看模型:这表示您希望最终用户查看/编辑/等的对象。视图模型可以包含来自多个域模型或不包含域模型的属性,并且通常会排除最终用户不应该使用的属性。视图模型应只包含为特定请求显示适当数据给最终用户所需的元素。

Here is some Jimmy Bogard为您查看模型及其使用。

22

模型通常与数据存储(数据库,服务等)的关系更密切,模型与这些模型非常相似。

另一方面,ViewModel与您的数据呈现给用户的方式密切相关。它通常是您的模型的扁平版本,非规范化等等。它可以是多个模型的聚合。

对于典型的Person的对象,你的模型可能包含的属性如下所示:

  • 名字
  • 出生日期

然而,在您的视图模型,你可以选择代表它不同,并有更多像:

  • 全名
  • 年龄
+1

我会补充说一个Model对象应该代表对象的语义/概念结构,它的内在/自然属性和行为,而不是它实际存储的方式。存储受制于实现细节,这不是实际的对象特性。 – heltonbiker

+1

@heltonbiker,这是一个伟大的观点。我认为有许多模型,ViewModel,业务逻辑模型,数据存储模型等等。我们经常挣扎,因为我们不接受每个人的差异,而是关注他们的相似之处。我很快就可以写一篇博客文章;) –

+1

在我看来,模型是最重要的开发活动中最被忽视的部分(至少在我知道的大多数地方......) – heltonbiker