2010-10-21 57 views
1
匹配

我有我的應用程序下面的路由...路線與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); 

任何人都可以幫我弄清楚我做錯了什麼嗎?

回答

2

不幸的是,我認爲生成URL的邏輯不能很好地處理靜態URL。我相信一兩件事你可以做的是:

routes.MapRoute( 「品牌」, 「{}控制器/bar.css」, 新{控制器= 「DynamicContent類」,行動= 「CSS」}, 新{controller =「foo」} );

試一下。

+0

感謝菲爾,它的工作原理比我的建議更清潔(回想起來很像雙重否定) - 我很感激! – Mayo 2010-10-23 03:16:15

1

我仍然不確定爲什麼我看到上面的行爲,所以如果任何人想用自己的想法隨意插話。這就是說,如果有人遇到同樣的問題,我可以通過顛倒路線順序來克服它,首先添加更多不明確的默認路線並添加一個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" } 
); 

對於那些想知道什麼是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; 
    } 
} 

我很喜歡聽到這樣做的更好方法或爲什麼我的原始代碼不完全工作。