更改控制器在项目结构中的位置

本文关键字:位置 结构 项目 控制器 | 更新日期: 2023-09-27 18:22:44

我发现了这篇关于更改视图位置的文章(如何扩展MVC查找视图的位置)。

我想知道是否有类似的东西可以改变控制器的位置。

我只想更改类在项目中的位置,不想影响url。

例如,不将控制器放入

MyMvcProject'Controllers'
                      MyController1.cs 
                      MyController2.cs 
                      MyController3.cs 

我想实现类似的目标

MyMvcProject'MyGroup1'
                      MyController1.cs
                      MyController2.cs
MyMvcProject'MyGroup2'
                      MyController3.cs

以及支持领域:

MyMvcProject'Areas'MyGroup3'
                      MyController4.cs

有可能做到这一点吗?如果是,我在哪里可以找到有关它的文档?

更改控制器在项目结构中的位置

您可以随心所欲,而且不需要任何特殊配置,因为ASP.NET MVC不关心控制器的位置。首先,控制器是使用反射定位的,因此放置控制器的文件夹的名称无关紧要。控制器按类型名称进行搜索,也可以按命名空间进行搜索(以消除歧义)。您甚至可以在单独的项目/程序集中拥有控制器。只要控制器最终在bin文件夹中的程序集中,那么它就可以被框架搜索。

如上所述,您需要创建一个控制器工厂来支持您的自定义解析。这里有一个例子:

http://develoq.net/2010/custom-controller-factory-in-asp-net-mvc/

正如其他人已经指出的那样,您需要执行以下操作之一:

  1. IControllerFactory接口派生,并提供了CreateControllerReleaseController方法的实现
  2. DefaultControllerFactory派生并覆盖默认行为

这里有一些链接可以让你开始:

  • ASP.Net中的自定义控制器工厂
  • ASP.NET MVC控制器工厂内部
  • 深入MVC-IControllerFactory

此外,如果你愿意花一点钱,我也推荐这本书Pro ASP.NET MVC 3 Framework,因为这本书几乎解释了如何自定义MVC框架的各个方面(包括一个关于如何创建自定义控制器工厂的示例,其源代码可以从发行商网站免费下载)。

我认为这是不可能的。ASP.NET MVC定义了我们必须遵循的约定。控制器在Controllers文件夹中,视图在views{ControllerName}''

我相信,除非创建自己的ControllerFactory,否则无法更改约定。

如果您真的想这样做,只需实现IControllerFactory接口(或尝试从DefaultControllerFactory派生)。

然后您的Application_Start使用ControllerBuilder.Current.SetControllerFactory方法注册控制器工厂。

有关详细信息,请参阅ControllerFactory文档和MVC源代码。

您所问的问题和示例显示的内容是两回事;根据你想要实现的目标,你可能需要也可能不需要做任何工作。

在MVC框架中,类作为控制器有两个要求:

  1. 它的类名必须为name+"Controller"
  2. 它必须有一个无参数的公共构造函数

您的示例"正常"MVC布局实际上是无效的:

MyMvcProject'Controllers'
                      MyController1.cs 
                      MyController2.cs 
                      MyController3.cs 

MVC找不到这些类,因为无论它们在哪个文件夹中,它们都没有正确的名称

如果你只想更改名称空间/文件夹名称,那么"就行了",假设你将它们命名为合适的路由段:

MyMvcProject'MyGroup1'
                      Page1Controller.cs
                      Page2Controller.cs
MyMvcProject'MyGroup2'
                      Page3Controller.cs
MyMvcProject'Areas'Area1'
                      Area1Page1Controller.cs

本演练(为MVC 2编写,但在MVC3中同样有效)向您展示了如何使用默认控制器行为来支持Area。

如果您真的想将它们命名为SomethingController1SomethingElseController5,或者以其他方式更改路由->类名映射,那么确实需要实现一个自定义ControllerFactory,并将其注入MVC管道。

网上有很多关于如何做到这一点的例子,包括之前发布的例子。