与GetVirtualPath匹配的路由
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与GetVirtualPath匹配的路由相关的知识,希望对你有一定的参考价值。
我的应用程序中具有以下路由...
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);
有人可以帮我弄清楚我在做什么错吗?
答案
[不幸的是,我认为生成URL的逻辑不能很好地处理静态URL。我相信您可以做的一件事是:
routes.MapRoute(
"Branding",
"{controller}/bar.css",
new { controller = "DynamicContent", action = "CSS" },
new {controller="foo"}
);
尝试一下。
另一答案
我仍然不确定我为什么会看到上面的行为,因此,如果有人想随心所欲地发表自己的想法,请随意发表。
也就是说,如果其他人遇到了相同的问题,我可以通过颠倒路线顺序来解决此问题,首先添加更具歧义性的默认路线,并添加一个NotEqual约束,以确保根据需要点击DynamicContent路线。
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" }
);
对于那些想知道不相等的人,我找到了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;
}
}
我当然愿意听到更好的方法,或者为什么我的原始代码不能完全正常工作。
以上是关于与GetVirtualPath匹配的路由的主要内容,如果未能解决你的问题,请参考以下文章