C# MVC3路由表错误
我有这个RegisterRoute函数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
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模式匹配?