我有一个关于保持控制器和视图分开的问题。在我看来,控制器应该只将模型传递给视图,视图决定如何显示模型。这样,控制器和模型保持独立,可以独立开发。但是,我在网上看到很多教程,甚至在Pro ASP.NET MVC Framework一书中,我看到很多使用ViewData [“string”]或TempData [“string”]的例子。
这不会引入两个问题吗?第一个是视图现在有点耦合到控制器,因为它必须知道控制器在ViewData / TempData中设置的字符串的名称。第二个是这些是松散类型的,这意味着没有Intellisense。如果我正在开发控制器,我不能告诉另一个在视图上工作的开发人员只使用Intellisense作为模型,我必须给他字符串的名称,如果我更改字符串名称,我还必须在视图中更改它。
我想我最终要问的是,这是对的吗?或者我不明白什么?
答案 0 :(得分:4)
View Data是在视图和控制器之间传递信息的一种方法,但正如你所说,没有智能,它增加了耦合。相反,您应该考虑使用ViewModel。请参阅Scott Gu NerdDinner example(免费提供)有关使用ViewModel的方式以及ViewDate与ViewModel的优缺点。
我希望它会有所帮助。
答案 1 :(得分:2)
我认为教程和书籍正在使用这种方法来尝试让事情更容易开始。但是,我认为这可能会引发一些不良习惯,如你所说。
我的方式大致基于此article by Jimmy Bogard:
我不像他那样使用自动映射器。我通常使用实用程序方法将我的Model对象转换为关联的ViewModel对象。
答案 2 :(得分:1)
是的,你是对的,创建一个通常被称为ViewModel的类被认为是最佳实践,该类正在View中发送/使用。 ViewModel通常包含模型以及视图可能需要的任何其他数据,例如分页列表视图的页码,或者要显示的视图列表的值。