通过使用强类型对象保持控制器和视图分离

时间:2009-09-09 01:26:27

标签: asp.net-mvc model controller

我有一个关于保持控制器和视图分开的问题。在我看来,控制器应该只将模型传递给视图,视图决定如何显示模型。这样,控制器和模型保持独立,可以独立开发。但是,我在网上看到很多教程,甚至在Pro ASP.NET MVC Framework一书中,我看到很多使用ViewData [“string”]或TempData [“string”]的例子。

这不会引入两个问题吗?第一个是视图现在有点耦合到控制器,因为它必须知道控制器在ViewData / TempData中设置的字符串的名称。第二个是这些是松散类型的,这意味着没有Intellisense。如果我正在开发控制器,我不能告诉另一个在视图上工作的开发人员只使用Intellisense作为模型,我必须给他字符串的名称,如果我更改字符串名称,我还必须在视图中更改它。

我想我最终要问的是,这是对的吗?或者我不明白什么?

3 个答案:

答案 0 :(得分:4)

View Data是在视图和控制器之间传递信息的一种方法,但正如你所说,没有智能,它增加了耦合。相反,您应该考虑使用ViewModel。请参阅Scott Gu NerdDinner example(免费提供)有关使用ViewModel的方式以及ViewDate与ViewModel的优缺点。

我希望它会有所帮助。

答案 1 :(得分:2)

我认为教程和书籍正在使用这种方法来尝试让事情更容易开始。但是,我认为这可能会引发一些不良习惯,如你所说。

我的方式大致基于此article by Jimmy Bogard

  • 所有观点都是强类型的
  • 每个View
  • 一个特定的ViewModel类
  • View确定ViewModel中的数据

我不像他那样使用自动映射器。我通常使用实用程序方法将我的Model对象转换为关联的ViewModel对象。

答案 2 :(得分:1)

是的,你是对的,创建一个通常被称为ViewModel的类被认为是最佳实践,该类正在View中发送/使用。 ViewModel通常包含模型以及视图可能需要的任何其他数据,例如分页列表视图的页码,或者要显示的视图列表的值。