2012-06-25 54 views
2

我注意到一個SO回答提示or-delimited matches for IgnoreRoute,像這樣:速記IgnoreRoute

routes.IgnoreRoute("*.js|css|swf"); 

當我給一個嘗試,它失敗了。我不得不轉換,暗示一行的代碼爲多行,像這樣:

routes.IgnoreRoute("Javascript/{*catchall}"); 
routes.IgnoreRoute("Content/{*catchall}"); 
routes.IgnoreRoute("Scripts/{*catchall}"); 

是否有事實Express文件的豁免(如CSS,JavaScript等)更緊湊的方式嗎?另外,我想知道原始鏈接是否真的錯了,或者我錯過了一些東西。

是的,請假設我想要和需要routes.RouteExistingFiles = true

回答

2

我想出了一個簡單的方法:

routes.RouteExistingFiles = true; 
routes.IgnoreRoute("{*relpath}", new { relpath = @"(.*)?\.(css|js|htm|html)" }); 

無需擔心任何尾隨HTTP查詢字符串,如System.Web.Routing.Route類在評估過程中已經剝去了這部分內容。

這也是有趣的是,內Route.GetRouteData(...)的代碼將採取提供正則表達式的約束,並添加「開始」和「結束」線的要求,就像這樣:

string str = myRegexStatementFromAbove; 
string str2 = string.Concat("^(", str, ")$"); 

這是爲什麼我寫不工作,如果它僅僅寫成正則表達式:

routes.IgnoreRoute("{*relpath}", new { relpath = @"\.(css|js|htm|html)" }); 
1

我不知道你是否能在一個單一的行指定所有的人。另一種方法是您可以創建自定義路由約束,並完全忽略這些文件夾/ 文件

UPDATE:

基於從@Brent檢查pathinfo比比較folder更好的反饋。

public class IgnoreConstraint : IRouteConstraint 
{ 
    private readonly string[] _ignoreList; 

    public IgnoreConstraint(params string[] ignoreList) 
    { 
     _ignoreList = ignoreList; 
    } 

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, 
    RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return _ignoreList.Contains(Path.GetExtension(values["pathinfo"].ToString())); 
    } 
} 

的Global.asax.cs

routes.IgnoreRoute("{*pathInfo}", new { c = 
      new IgnoreConstraint(".js", ".css") }); 

routes.RouteExistingFiles = true; 

============================= ================================================== =

上一頁代碼

public class IgnoreConstraint: IRouteConstraint 
    { 
    private readonly string[] _ignoreArray; 

    public IgnoreConstraint(params string[] ignoreArray) 
    { 
     _ignoreArray = ignoreArray; 
    } 

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, 
     RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var folder = values["folder"].ToString().ToLower(); 

     return _ignoreArray.Contains(folder); 
    } 
    } 

在Global.asax.cs中

routes.IgnoreRoute("{folder}/{*pathInfo}", new { c = 
      new IgnoreConstraint("content", "script") }); 

routes.RouteExistingFiles = true; 
+0

通過「定製約束」的級別的,已經做出努力的時候,那麼我可能會更好過只用一個詳細列出IgnoreRoute語句,假設它不是一個很長的列表。不過,如果我測試了{* pathInfo}中的文件擴展名,而不是{文件夾}段中的文件夾,那麼我會試圖使用您的解決方案。這樣我就不會在乎我的.js,.css或.html文件在哪裏找到了。建議自定義約束的榮譽。 –

+0

我同意你檢查pathinfo比文件夾好很多。當我嘗試時,我很懶惰。那麼,我更新答案,以便對某人有所幫助。感謝您指出:) – VJAI

+0

我喜歡更新。優秀! –