路由表错误

本文关键字:错误 路由 | 更新日期: 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);
}