ASP.NET MVC3,为什么我们需要强类型的View?

时间:2012-02-13 07:18:15

标签: asp.net-mvc-3

我已阅读Scott Guthrie的博客 - ASP.NET MVC 3: New @model keyword in Razor

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

例如,论坛网站的用户控制面板,它可能包含用户信息,帖子历史,用户设置等。

从数据模型的角度来看,绑定源可以来自不同的表:users,posts,user_settings等。

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

实际上,我可以为我必须使用的模型添加哪些属性。 那么,使视图变为强类型的优势是什么?

4 个答案:

答案 0 :(得分:4)

  

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

是的,这应该是您的视图模型。视图模型是您专门设计的类,以满足给定视图的要求。你为每个视图执行此操作

  

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

单个页面将包含一个视图模型。

例如:

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

您的UserName属性将来自Users表及其中的UserName字段。 您的主题可能来自主题表和来自另一个主题的消息。

您的观点应仅关注呈现已处理的信息,而不是查询数据源。

答案 3 :(得分:1)

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

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

优势在于,通过强类型输入,运行时错误的可能性更小。此外,当某些内容发生变化(即数据库列)时,IDE将直接检测到这些错误。