我已阅读Scott Guthrie的博客 - ASP.NET MVC 3: New @model keyword in Razor
我没有意识到的一件事是页面将以不同的方式绑定值,但为什么我们必须从模型强制执行视图绑定?
例如,论坛网站的用户控制面板,它可能包含用户信息,帖子历史,用户设置等。
从数据模型的角度来看,绑定源可以来自不同的表:users,posts,user_settings等。
但是,一个视图只能引用一个@model指令。
实际上,我可以为我必须使用的模型添加哪些属性。 那么,使视图变为强类型的优势是什么?
答案 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将直接检测到这些错误。