更改控制器在项目结构中的位置
本文关键字:位置 结构 项目 控制器 | 更新日期: 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/
正如其他人已经指出的那样,您需要执行以下操作之一:
- 从
IControllerFactory
接口派生,并提供了CreateController
和ReleaseController
方法的实现 - 从
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框架中,类作为控制器有两个要求:
- 它的类名必须为name+"Controller"
- 它必须有一个无参数的公共构造函数
您的示例"正常"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。
如果您真的想将它们命名为SomethingController1
或SomethingElseController5
,或者以其他方式更改路由->类名映射,那么确实需要实现一个自定义ControllerFactory
,并将其注入MVC管道。
网上有很多关于如何做到这一点的例子,包括之前发布的例子。