ASP.NET MVC自定义控制器目录

时间:2009-07-14 20:17:06

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

我正在创建一个ASP.NET MVC网站,我有一组相关的表单(让我们称之为Foo)。我组织他们的第一次尝试是拥有这种结构:

Controllers/FooController.cs

......并且有这样的路线:

Foo/{type}/{action}/{id}

不幸的是,由于大约有8个Foo子类型,FooController变得非常大并且包含它自己的子路由信息。我的下一步就是拥有这种结构:

Controllers/Foo/Form1Controller.cs
Controllers/Foo/Form2Controller.cs
Controllers/Foo/Form3Controller.cs
...

每个表单都有一个控制器,这对我来说更有意义,因为这基本上就是我在应用程序中用于其他表单的布局。

不幸的是,我似乎无法找到任何简单的方法来制作路线:

Foo/{controller}/{action}/{id}

... map to:

Controllers/Foo/{controller}Controller.cs

基本上我想要做的是告诉ASP.NET MVC我希望所有与Foo路由匹配的路由都在Foo Controllers子文件夹中查找其控制器。有什么简单的方法可以通过路由来完成,或者我是否需要编写自己的IControllerFactory

感谢。

3 个答案:

答案 0 :(得分:4)

我最终使用了此处讨论的解决方案的变体:

http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx

答案 1 :(得分:1)

我认为你要找的是SubControllers

答案 2 :(得分:1)

你尝试过RouteConstraint吗?它不是关于目录而是控制器名称,但非常简单 - 你应该尝试:

routes.MapRoute("FooControllers",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "" },
    new { controller = @"(Form1)|(Form2)|(Form3)" }
);

或:

routes.MapRoute("FooControllers",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "" },
    new { controller = @"Form[1..8]" }
);