【问题标题】:Change the Location of the Controller inside the Project structure在项目结构中更改控制器的位置
【发布时间】:2012-02-07 09:00:23
【问题描述】:

我发现this Post (How to extend where MVC looks for views) 关于更改视图的位置。

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

我只是想改变项目内类的位置,不想影响url。

例如而不是将Controller放入

MyMvcProject\Controllers\
                      MyController1.cs 
                      MyController2.cs 
                      MyController3.cs 

我想实现类似的目标

MyMvcProject\MyGroup1\
                      MyController1.cs
                      MyController2.cs

MyMvcProject\MyGroup2\
                      MyController3.cs

还支持区域:

MyMvcProject\Areas\MyGroup3\
                      MyController4.cs

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

【问题讨论】:

  • 我真的很讨厌发布这种回复,但您可能不应该尝试这样做。不会有真正的目的,不是吗?也许我错过了什么。
  • 我想你在提问之前没有测试过。 MVC 不关心控制器和模型的位置。当您不想要控制器后缀或无参数构造函数时,您需要使用自定义工厂。看,这个链接,forums.asp.net/p/1633844/4216014.aspx

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


【解决方案1】:

你可以做你想做的事,它不需要任何特殊的配置,因为 ASP.NET MVC 不关心你把控制器放在哪里。首先,控制器使用反射定位,因此放置控制器的文件夹的名称无关紧要。控制器按类型名称搜索,也可选择按名称空间搜索(用于消除歧义)。您甚至可以在单独的项目/程序集中拥有控制器。只要控制器最终出现在 bin 文件夹中的程序集中,那么框架就可以搜索它。

【讨论】:

  • +1 - 这就是我要在这里回答的问题。控制器被编译到 bin dll 文件中,因此按类型定位。另一方面,视图是从文件夹结构中提供的,因此必须按照约定很容易地动态定位。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    以下是一些帮助您入门的链接:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 嗯,可以按照我发布的链接中的说明更改查看位置。所以我希望控制器也可以。
      【解决方案5】:

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

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

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

      查看 ControllerFactory 文档和 MVC 源代码了解详细信息。

      【讨论】:

      • 愿意这样做,但没有找到任何相关文档。
      【解决方案6】:

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

      类要成为 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
      

      This walkthrough(为 MVC 2 编写,但在 MVC3 中同样有效)向您展示了如何支持具有默认控制器行为的区域。

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

      网上有很多关于如何做到这一点的例子,包括the one posted earlier

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 2010-09-06
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多