2011-09-28 51 views
0

所以,我在我的global.asax中創建了我的MVC路線。它們按照它們出現在下面的順序被調用。我預計將有發生是它會忽略到css文件夾的路徑,但隨後創建路由的CSS/branding.css(這是在運行時從另一個視圖生成)我可以創建一條匹配已經被忽略的路線的路線嗎?

_routeCollection.IgnoreRoute("css/{*pathInfo}"); 

_routeCollection.MapRoute("BrandingCSS", "css/branding.css", new { controller = "Branding", action = "Css" }); 

這是不可能的?當我向css/branding.css發出請求時,出現404錯誤,表示該文件不存在。有沒有辦法使這項工作,我寧願它是透明的查看源文件來自任何地方,除了css文件夾的任何人。

回答

1

您可以通過在IgnoreRoute中設置RouteConstraint來創建和提供自定義CSS文件。創建以下限制:

public class NotBrandingCss : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return values[parameterName].ToString().ToLowerInvariant() != "branding.css"; 
    } 
} 

然後,改變你的IgnoreRoute以下幾點:

_routeCollection.IgnoreRoute("css/{*pathInfo}", new { pathInfo = new NotBrandingCss() }); 

現在,請求/css/branding.css將失敗的IgnoreRoute,並會去你的BrandingCSS路線等

+0

有意思,謝謝!這確實奏效,但是,不管信不信,當我改變添加路由和忽略路由的順序時,它也可以工作。我仍然會將你的標記作爲答案 –

+0

非常有趣。我曾假設'IgnoreRoutes'在MapRoutes之前被處理,但是從你的測試中可以看出,路由表是按照添加項目的嚴格順序進行檢查的。深入瞭解MVC3源代碼的時間。 – counsellorben

+0

是的,今天重新測試後,它沒有工作。我一定錯過了測試另一個我的css文件,它不起作用。 –