控制器的部分类

时间:2012-03-13 09:20:52

标签: c# asp.net-mvc-3

是否可以在MVC中为控制器创建Partial类?

原因:我有一个包含太多代码的控制器。该控制器包含不同报告的代码,由于代码太多,会降低代码的可读性。我想保持所有报告的控制器名称相同,所以我想为不同的报告分发代码。

如果我可以采取任何其他方式,请告诉我。

由于 Alok Shah

4 个答案:

答案 0 :(得分:14)

是的,您可以使用部分类 - 编译器只是将它们合并到编译时以生成一个。

但是,你提到你要“分发”代码 - 如果代码要进入多个项目,那么部分代码就无法提供帮助。

您可以使用必要的操作方法创建基类控制器类(从类库项目中的System.Web.Mvc.Controller继承),然后使用路由将类似的URL路由到不同的控制器。Here's a link to the Asp.Net Tutorial 'Creating Custom Routes'可能对此有用。如果MVC的其他核心方面你不确定的话,我会建议你仔细阅读本教程的其余内容。它并不涵盖所有内容,但它具有基础知识。

需要使用它们的Web应用程序只是拥有自己的控制器继承自那些可再发行的控制器。更好的是,如果存在不同Web应用可能需要自定义的这些报告的元素,您现在可以通过虚拟方法等创建可扩展性点。

因此"Reports/Customers"可以路由到CustomerReportsController"Reports/Orders"可以路由到OrdersReportsController

routes.MapRoute("CustReports",
  "Reports/Customers/{action}",
  new { controller = "CustomerReports", action = "Index", id = "" } );

routes.MapRoute("OrderReports",
  "Reports/Orders/{action}",
  new { controller = "OrdersReports", action = "Index", id = "" } );

这是解决此问题的最简单方法 - 但我认为使用Areas(链接到MSDN演练)很可能也适用,在这种情况下,您可能根本不需要使用路由,因为默认路线可能会全部完成。

答案 1 :(得分:6)

当然!

部分类是C#语言的一个特性,与MVC或您可能正在使用的任何其他框架无关。

答案 2 :(得分:0)

是。部分类实际上只是该语言的一个特性,而编译的类是一个常规的.NET类,与其他类似。

我建议您将控制器拆分为多个控制器,以确保关注点的正确分离(有一个如此大的类,您需要将其拆分为多个文件肯定会smell bad。)

答案 3 :(得分:0)

“如果我可以采取任何其他方式而不是让我知道”

怎么样:

  • 将离散报告类型的“执行”部分摘要到各种报告生成器,所有这些都符合接口。这些报告生成器将是位于应用程序MVC层之外的类。
  • 清理控制器,以便使用Ninject,StructureMap或Castle Windsor在构造函数中注入依赖项(报表生成器)
  • 清除控制器外的所有报告生成代码,并将其转换为报告生成器抽象的具体实现

然后,您不需要将控制器拆分为单独的类。缺点是需要花费一定的时间来构思和实现,但最终会得到更好的代码库。