2

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

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?

编辑

我添加了我拥有的所有路线

4

2 回答 2

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}通过,我对此表示怀疑。从您的问题来看,您似乎只希望 /Request/Approval/ 转到您的 Approval 控制器。

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

于 2012-06-18T19:44:43.997 回答
1

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

但是,您仍然会遇到问题,因为任何事情/request/something都会寻找SomethingContoller. 要解决此问题,请将您的路线更改为:

routes.MapRoute(
        "Approval",
        "Request/Approval/{action}",
        new { controller = "Approval", action="Index", id = "" }
    );
于 2012-06-18T19:46:59.473 回答