在Project结构中更改Controller的位置

时间:2012-02-07 09:00:24

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

我发现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

有可能实现这一目标吗?如果是,我在哪里可以找到有关它的文档?

6 个答案:

答案 0 :(得分:3)

您可以执行您想要的操作,并且不需要任何特殊配置,因为ASP.NET MVC并不关心您放置控制器的位置。首先,控制器使用反射定位,因此放置控制器的文件夹名称无关紧要。控制器按类型名称搜索,也可以按名称空间搜索(用于消除歧义)。您甚至可以在单独的项目/程序集中安装控制器。只要控制器在bin文件夹中的程序集中结束,就可以通过框架进行搜索。

答案 1 :(得分:1)

如上所述,您需要创建一个控制器工厂来支持您的自定义分辨率。这是一个例子:

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

答案 2 :(得分:1)

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

  1. IControllerFactory界面导出并提供CreateControllerReleaseController方法的实现。
  2. DefaultControllerFactory派生并覆盖默认行为。
  3. 以下是一些可以帮助您入门的链接:

    另外,如果你愿意花一点钱,我也会推荐这本书 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框架中,类有两个要求作为控制器:

  1. 必须具有名称 +“控制器”
  2. 的班级名称
  3. 它必须有一个无参数的公共构造函数。
  4. 您的示例“普通”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。

    如果您确实要为其命名SomethingController1SomethingElseController5,或以其他方式更改路线 - > classname映射,然后你需要实现自定义ControllerFactory,并将其注入MVC​​管道。

    网上有很多关于如何执行此操作的示例,包括the one posted earlier