我的应用程序中有以下路由...
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Branding",
"foo/bar.css",
new { controller = "DynamicContent", action = "CSS" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);
}
我正在使用Martijn Boland's paging mechanism,最终会进行以下调用:
var virtualPathData =
RouteTable.Routes.GetVirtualPath(this.viewContext.RequestContext, pageLinkValueDictionary);
我已经验证我的RequestContext中的控制器和操作是有效的。但是一旦进行了这个调用,virtualPathData引用了foo / bar.css的URL。我已经验证了URL映射到正确的控制器/操作。如果我注释掉上面的路由而保留默认值,则virtualPathData的URL对应于正确的控制器/操作。
我也尝试过以下一行,结果相同。
//var virtualPathData =
RouteTable.Routes.GetVirtualPathForArea(this.viewContext.RequestContext, pageLinkValueDictionary);
任何人都可以帮我弄清楚我做错了吗?
答案 0 :(得分:2)
不幸的是,我认为生成URL的逻辑不能很好地处理静态URL。我相信你能做的一件事是:
routes.MapRoute( “品牌”, “{}控制器/bar.css”, new {controller =“DynamicContent”,action =“CSS”}, 新{controller =“foo”} );
尝试一下。
答案 1 :(得分:1)
我仍然不确定为什么我会看到上述行为,所以如果有人想要让他们的想法充满信心,那就感到自由。
也就是说,如果其他人遇到同样的问题,我可以通过颠倒路由顺序来克服它,首先使用NotEqual约束添加更加模糊的默认路由,以确保根据需要命中DynamicContent路由。 / p>
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Account", action = "Index", id = UrlParameter.Optional },
new { controller = new NotEqual("DynamicContent") }
);
routes.MapRoute(
"Branding",
"foo/bar.css",
new { controller = "DynamicContent", action = "CSS" }
);
对于那些想知道NotEqual是什么的人,我发现它on a blog。
public class NotEqual : IRouteConstraint
{
private string _match = string.Empty;
public NotEqual(string match)
{
_match = match;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return String.Compare(values[parameterName].ToString(), _match, true) != 0;
}
}
我肯定会听到更好的方法,或者为什么我的原始代码没有完全正常工作。