我发现this Post (How to extend where MVC looks for views)有关更改视图的位置。
我想知道是否有类似改变控制器位置的东西。
我只想更改项目中类的位置,不想影响网址。
例如,而不是将Controller置于
MyMvcProject\Controllers\
MyController1.cs
MyController2.cs
MyController3.cs
我希望实现像
这样的东西MyMvcProject\MyGroup1\
MyController1.cs
MyController2.cs
MyMvcProject\MyGroup2\
MyController3.cs
并支持区域:
MyMvcProject\Areas\MyGroup3\
MyController4.cs
有可能实现这一目标吗?如果是,我在哪里可以找到有关它的文档?
答案 0 :(得分:3)
您可以执行您想要的操作,并且不需要任何特殊配置,因为ASP.NET MVC并不关心您放置控制器的位置。首先,控制器使用反射定位,因此放置控制器的文件夹名称无关紧要。控制器按类型名称搜索,也可以按名称空间搜索(用于消除歧义)。您甚至可以在单独的项目/程序集中安装控制器。只要控制器在bin
文件夹中的程序集中结束,就可以通过框架进行搜索。
答案 1 :(得分:1)
如上所述,您需要创建一个控制器工厂来支持您的自定义分辨率。这是一个例子:
http://develoq.net/2010/custom-controller-factory-in-asp-net-mvc/
答案 2 :(得分:1)
正如其他人已经说过的那样,您需要执行以下操作之一:
IControllerFactory
界面导出并提供CreateController
和ReleaseController
方法的实现。DefaultControllerFactory
派生并覆盖默认行为。以下是一些可以帮助您入门的链接:
另外,如果你愿意花一点钱,我也会推荐这本书 Pro ASP.NET MVC 3 Framework ,因为这解释了MVC框架如何定制的几乎所有方面(包括如何创建自定义控制器工厂的示例 - 可以从发布商网站免费下载的源代码。)
答案 3 :(得分:0)
我认为不可能这样做。 ASP.NET MVC定义了我们必须遵循的约定。 控制器位于Controllers文件夹中,视图位于Views {ControllerName} \
中答案 4 :(得分:0)
我相信你不能改变约定,除非你创建自己的ControllerFactory。
如果你真的想这样做,只需实现IControllerFactory接口(或尝试从DefaultControllerFactory派生)。
然后,您的Application_Start使用ControllerBuilder.Current.SetControllerFactory方法注册您的控制器工厂。
查看ControllerFactory文档和MVC源代码以获取详细信息。
答案 5 :(得分:0)
你在问什么,你的例子显示的是两件不同的事情;根据您想要达到的目标,您可能需要也可能不需要做任何工作。
在MVC框架中,类有两个要求作为控制器:
您的示例“普通”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
This walkthrough(为MVC 2编写但在MVC3中也能正常工作)向您展示了如何使用默认控制器行为支持Area。
如果您确实要为其命名SomethingController1
或SomethingElseController5
,或以其他方式更改路线 - > classname映射,然后你做需要实现自定义ControllerFactory
,并将其注入MVC管道。
网上有很多关于如何执行此操作的示例,包括the one posted earlier。