MVC路由与部分类

时间:2012-06-18 19:38:07

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

我有一个失控的请求控制器,我想在几个控制器上划分操作,同时保持一个干净的URL。我正在尝试路由,但没有成功。我已经阅读了一些关于路由的示例和教程,但是,虽然我理解这些示例,但似乎没有什么适用于我的情况,我觉得不是更明智。我想要的是在我的ApprovalController而不是我的RequestController上处理URL Requests/Approval,所以我写了以下内容。

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Approval",
            "Request/{controller}/{action}",
            new { controller = "Approval", action="Index", id = "" }
        );

    }

但它不起作用。为什么?我在我的视图中有一个名为Approval的文件夹,在那里我有一个名为Index.cshtml的文件。我该如何编写MapRoute代码?

修改

我添加了所有路线

2 个答案:

答案 0 :(得分:5)

您需要交换两个MapRoute语句,如下所示:

routes.MapRoute(
    "Approval",
    "Request/Approval/{action}",
    new { controller = "Approval", action="Index", id = "" }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

它当前不起作用的原因是因为第一个语句('默认'路由名称)在第二个语句被评估之前得到匹配。

另外(如上面的示例中所述),您需要删除Approval路径中的“{controller}”并替换为“Approval”...除非您特别需要URL / Request / {ANY controller} / {action}要经历,我怀疑。根据您的问题,您似乎只需要/请求/批准/转到您的审批控制器。

不要忘记将默认路线保留在底部,以便与其他控制器和操作相匹配。如果不存在其他匹配,它就可以作为一个包罗万象。

答案 1 :(得分:1)

您映射路线的顺序很重要。在默认路由之前移动第二条路线。

但您仍然会遇到问题,因为/request/something会查找SomethingContoller。要解决此问题,请更改您的路线:

routes.MapRoute(
        "Approval",
        "Request/Approval/{action}",
        new { controller = "Approval", action="Index", id = "" }
    );