ASP.NET MVC - 从单个控制器动作返回不同的视图是个坏主意吗?

时间:2009-01-08 15:54:05

标签: asp.net-mvc

我正在开发一个ASP.NET MVC项目,我正在使用路由来生成友好的URL并遇到问题我不知道如何最好地解决。

我设置的路由工作类似于以下

{类别}

{类别} / {制造商}

{类别} / {制造商} / {产物}

我遇到的问题是我想以不同的方式显示相同路线的匹配。 e.g。

类别1显示

  • 描述后跟
  • 图片后跟
  • 产品清单

Category2显示

  • 图片后跟
  • 促销活动后跟
  • 描述

我已经通过将枚举ViewTemplate与该类别相关联然后返回具有相同名称的视图来解决这个问题,但这感觉不对,首先是因为我不确定我应该是这样的逻辑控制器动作,我仍然进行相同的数据库调用,这对某些东西很好,但如果一个类别有500个产品,我仍然将它们从数据库中拉出来,即使它们不会被使用。现在到了这一点:

  1. 从同一个控制器操作返回不同的视图是错误的吗?
  2. 您如何处理为每个视图加载不同的数据?
  3. 如果我错了(我认为我是这样的话)我该怎么办?
  4. 感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

我不是这里的大师,但在其他MVC框架中,我已经完成(和看过)类似的事情。控制器的工作是根据询问者,询问的内容等来确定返回哪个视图。如何确定视图名称实际上是对应用程序和/或其可修改性/可测试性最佳的问题。

答案 1 :(得分:5)

在MVC中,控制器有责任决定返回哪个视图,因此拥有一个返回多个不同视图的控制器是完全正常的。控制器应该相对简单。他们应该接受客户的指示。访问模型以启动任何需要进行的更改。从模型中获取一些数据。并使用此数据来决定向客户显示哪个视图。

在你的情况下,我认为控制器适当的做法是:

  1. 获取有关该产品的一般信息。
  2. 使用此一般信息来决定使用哪个视图。
  3. 获取该特定视图的数据。
  4. 返回视图。
  5. 我认为如果你担心自己做错了,你需要确保模型只包含在域上下文中有意义的方法。它们不应与特定观点过于紧密联系。例如Product.GetDataForMiniProductView(int id)是错误的,这应该是控制器逻辑。另一方面,Product.GetStockCount绝对应该在模型中,而不是控制器。