我有这个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
答案 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);
}