MVC3路由表错误

时间:2011-11-27 10:46:55

标签: 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(
      "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

1 个答案:

答案 0 :(得分:1)

路线的评估顺序与注册时的顺序相同。您可以使用RouteLink显式指定路由名称:

@Html.RouteLink("About", "Default", new { action = "About" })

如果您颠倒定义的顺序,那么链接将正确生成,但在请求JsAction/网址时不会点击您的自定义路由,因为没有任何内容可以消除默认路由中的网址歧义。

您必须重新考虑您的路线结构,以便不存在此类冲突。你可以使用约束。请记住,默认路由非常急切,如果您不限制它,它通常会优先。

一种可能性是为您的自定义路线定义控制器和操作:

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);
}