我有一个失控的请求控制器,我想在几个控制器上划分操作,同时保持一个干净的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代码?
修改
我添加了所有路线
答案 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 = "" }
);