路由表错误
本文关键字:错误 路由 | 更新日期: 2023-09-27 18:15:56
我有这个RegisterRoute函数
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
其中JsActionRoute是这样的路由
public static readonly Route JsActionRoute = new Route("JsAction",
new JsAction.JsActionHandler());
我希望所有指向JsAction/的链接都由我的自定义路由处理。
现在当简单地调用@Html.ActionLink
时,Mvc3创建了一个与JsAction相关的链接,我不明白为什么。
@Html.ActionLink("About","About") -> JsAction?Action=About&Controller=Index
路由的评估顺序与它们注册的顺序相同。您可以使用RouteLink
显式指定路由名称:
@Html.RouteLink("About", "Default", new { action = "About" })
如果您颠倒定义的顺序,那么链接将正确生成,但是当请求JsAction/
url时,您的自定义路由将不会被命中,因为没有什么可以将此url与默认路由消歧。
你将不得不重新考虑你的路由结构,这样就不会有这样的冲突。你可以使用约束条件。请记住,默认路由是非常急切的,如果你不约束它,它通常会优先。
一种可能是为你的自定义路由定义一个控制器和动作:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
);
}
,然后通过指定要执行的控制器和动作来约束自定义路由:
public static readonly Route JsActionRoute = new Route(
"JsAction",
new RouteValueDictionary(new { action = "JsAction", controller = "Foo" })
new JsAction.JsActionHandler()
);
另一种可能性是颠倒路由的定义顺序,并约束默认路由:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "^((?!JsAction).)*$", action = "^((?!JsAction).)*$" }
);
routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute);
}