C# MVC3路由表错误

C# MVC3路由表错误,c#,asp.net,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc 3,我有这个RegisterRoute函数 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute); routes.MapRoute( "Defa

我有这个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/的链接都由我的coustom路线处理

现在只要调用
@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);
}

你能发布JsActionHandler代码吗?JsActionHandler只返回管理请求的HttpHandler(并导入一些js文件将它们写入响应)。RouteTable优先级有问题,但我不明白MVC为什么选择JsAction route来生成ActionLink。谢谢,它可以工作,但我不喜欢这个解决方案。有没有其他方法可以维护默认路由,同时让我的处理程序处理对JsAction/url的所有请求?@Vincenzo,没有,因为像
JsAction/
这样的url无法在自定义路由和默认路由之间消除歧义。顺序很重要,因此,如果您在默认路径之前注册您的路径,它将始终被使用。是否有其他解决方案,即使不使用其他路径处理程序?@Vincenzo,正如我所说,您将不得不重新考虑您的url结构。您可能需要修改默认路由定义以降低其紧迫性。如何修改默认url路由以避免与JsAction url模式匹配?