如何修改MapRoute(添加新目录)

时间:2010-03-26 10:09:46

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

如何更改我的地图路线,以便我可以拥有另一个目录,而不仅仅是控制器和操作。

我想要的是在控制器之前有另一个目录,这样我就可以按照“模块”

分离控制器
        routes.MapRoute(
            "Default",                                       // Route name
            "{module}/{controller}/{action}/{id}",           // URL with params
            new { module = "module", controller = "controller", action = "Index", id = ""}

这就是我想要的,但代码不起作用。我还需要更改以更改MapRoute吗?

2 个答案:

答案 0 :(得分:4)

您是否考虑过查看ASP.NET MVC 2的Areas功能?它可以满足您将站点划分为不同“模块”的要求。

  

Walkthrough: Organizing an ASP.NET MVC Application using areas

答案 1 :(得分:1)

我没有更好的解决方案,但会尝试实现自己的ViewEngine。

如果您的控制器在模块中,那么无法解析太多标准的ASP.NET MVC约定和路由。

我认为你应该实现自己的ViewEngine来支持它。

例如:

    public class ModuleViewEngine: WebFormViewEngine
{
    public ModuleViewEngine()
    {
        ViewLocationFormats = new[]
                    {
                        "~/views/{2}/{1}/{0}.aspx",
                        "~/views/{2}/{1}/{0}.ascx",
                        "~/views/Shared/{1}/{0}.aspx",
                        "~/views/Shared/{1}/{0}.ascx",
                    };
        MasterLocationFormats = new[]

        {
                "~/views/{1}/{0}.master",
                "~/views/Shared/{0}.master",
                "~/views/{2}/{1}/{0}.master",
                "~/views/{2}/Shared/{0}.master",
        };
    }

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext,
    string partialViewName, bool useCache)
    {
        //coede
    }

    public override ViewEngineResult FindView(
        ControllerContext controllerContext,
    string viewName, string masterName, bool useCache)
    {
        //code
    }
}

我们重新定义ViewLocationFormats和MasterLocationFormats 数组以容纳额外的参数(区域)。视图位置使用标准 字符串格式化占位符。第一个占位符表示操作 名称。第二个占位符是控制器名称和最终占位符, 是模块名称(如果已指定)。

FindPartialView和FindView方法,因此我们也必须覆盖它们。

因为我们的控制器现在将驻留在Controllers文件夹的子文件夹中,所以我们必须注册其他控制器名称空间:

ControllerBuilder.Current.DefaultNamespaces.Add( “Module.Controllers.something”);

这是必需的,因为默认的ControllerBuilder不希望反映出来 在将路径与特定路线匹配时,整个装配寻找控制器 控制器。