2012-02-13 54 views
1

我已阅读Scott Guthrie的博客 - ASP.NET MVC 3: New @model keyword in RazorASP.NET MVC3,为什么我们需要强类型的View?

我没有意识到的一件事是页面将以不同方式绑定值,但为什么我们必须强制从Model中绑定视图?

例如,论坛网站的用户的控制面板,它可以具有用户信息,后历史,用户设置等等

从数据模型的视图,绑定源可以来自不同的表:用户,帖子,user_settings等

但是,一个视图只能引用一个@model指令。

其实,我可以添加什么属性模型,我必须使用。 那么,使视图变成强类型的优点是什么?

+0

究竟是什么问题? – gdoron 2012-02-13 07:20:34

回答

4

然而,一个视图可以仅引用一个@model指令。

是的,这应该是您的视图模型。视图模型是您专门设计以满足给定视图要求的类。而这样做的每个视图

从数据模型的角度来看,绑定源可以来自不同 表:用户,文章,user_settings等

大,然后设计一个视图模型将包含所有必要的属性,并让控制器构建这个视图模型,聚合来自不同位置的信息并将其传递给视图以进行显示。

您不应将域模型传递给您的视图。因为视图通常是一个或多个领域模型的投影=>因此需要定义视图模型。

+0

我读过你和Rhapsody的回答,非常感谢你(SOF不要让我将两个标记为答案)。 另外,我搜索关于ViewModel的更多信息,并找到关于MVVM - http:// en的一些有趣信息。 wikipedia.org/wiki/Model_View_ViewModel。 – Cheung 2012-02-13 07:39:24

+3

@SilverNight,MVVM是WPF,Silverlight和WP7中更常用的设计模式。其中视图模型与域模型进行交互。这种模式不适用于ASP.NET MVC,其中视图模型不应该知道域模型的任何内容。在ASP.NET MVC中,负责执行不同领域模型和视图模型之间协调的控制器。在MVVM中没有控制器。 – 2012-02-13 07:46:04

+0

Phil Haack在* Professional ASP.Net MVC3 *中称这些'视图特定模型' - 正是因为可能与WPF MVVM混淆。它们并不是一回事,尽管它们有着相似的目的。 – 2013-03-08 16:29:28

3

1)可以使用自动scaffolding
2)IntelliSense支持
3)编译时间类型检查

1

因此,最好的做法是为每个视图创建一个ViewModel。此ViewModel包含视图所需的所有属性(用户,帖子,设置等)。

在控制器/模型可以实例化视图模型,并填写其属性。所以不要向视图提供单个表/记录列表,而是提供ViewModel。

的优点是,一切强类型的,还有上运行时错误的机会较少。此外,当某些内容发生变化(即数据库列)时,这些错误将直接由IDE检测到。

2

您的视图模型应与商业模型分离。

单页都将有一个单一的视图模式

例如:

public class UserPost 
{ 
    public string UserName { get; set; } 
    public string Subject { get; set; } 
    public IEnumerable<Message> Messages { get; set; } 
} 

您的用户名酒店将在用户表和它的用户名字段中来。 您的主题可能来自主题表格,而来自另一个主题的讯息。

您的观点应该只关注提供已经处理的信息,而不是查询数据源。