2012-12-21 17 views
23

css文件,我有這樣的束asp.net的MVC排除束

bundles.Add(new StyleBundle("~/Content/themes/default/css") 
     .IncludeDirectory("~/Content/themes/Default", "*.css")); 

,但我想從它排除一個CSS文件。 是否可以做到這一點,而無需指定捆綁中的每個CSS文件?

+1

爲什麼不把css文件移出該目錄? –

+1

當然,我可以這樣做,併爲這個文件指定另一個包,但是將所有文件放在一個目錄中會更好,如果我不需要它,我將它從包中排除 – xurca

+0

你有很多文件?如果您有少量文件,您可以單獨註冊每個css。 –

回答

34

嘗試使用IgnoreList.Ignore; bundles.IgnoreList.Ignore(...)

+2

有關很好的示例,請參閱:https://stack247.wordpress.com/2014/04/18/asp-net-mvc-4-bundles-ignore-list/ – Kildareflare

+0

這是一個可憐的答案。它沒有解釋如何使用忽略或如何訪問它。這只是一些不良文檔的鏈接,只是一小段代碼,這不能解釋這裏的特質。關於wordpress網站的評論是最有用的東西。 – Liam

13

擴展方法可能是你需要的東西在這裏:

public static class BundleExtentions 
{ 
    public static Bundle IncludeDirectoryWithExclusion(this StyleBundle bundle, string directoryVirtualPath, string searchPattern, params string[] toExclude) 
    { 
     var folderPath = HttpContext.Current.Server.MapPath(directoryVirtualPath); 

     foreach (var file in Directory.GetFiles(folderPath, searchPattern)) 
     { 
      if (!String.IsNullOrEmpty(Array.Find(toExclude, s => s.ToLower() == file.ToLower()))) 
      { 
       continue; 
      }  

      bundle.IncludeFile(directoryVirtualPath + "/" + file); 
     } 

     return bundle; 
} 

然後使用應該是:

bundles.Add(new StyleBundle("~/Content/themes/default/css") 
    .IncludeDirectoryWithExclusion("~/Content/themes/Default", "*.css", "file-you-dont-want.css")); 

我不是在此刻PC因此上述非是經過測試,但應該爲您提供解決方案的模板。

+0

我已經擴展了這個答案來添加搜索模式,並修復了.min版本的缺點:http://stackoverflow.com/a/36080620/1671558 –

1

這是另一種擴展方法,它重載現有的IncludeDirectory方法並支持搜索子目錄。

public static class BundleExtensions 
{ 
    public static Bundle IncludeDirectory(
     this Bundle bundle, 
     string directoryVirtualPath, 
     string searchPattern, 
     params string[] filesToExclude) 
    { 
     return IncludeDirectory(bundle, directoryVirtualPath, searchPattern, false, filesToExclude); 
    } 
    public static Bundle IncludeDirectory(
     this Bundle bundle, 
     string directoryVirtualPath, 
     string searchPattern, 
     bool searchSubdirectories, 
     params string[] filesToExclude) 
    { 
     var physicalPath = HttpContext.Current.Server.MapPath(directoryVirtualPath); 
     return bundle.Include(Directory 
      .EnumerateFiles(physicalPath, searchPattern, searchSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly) 
      .Select(physicalFileName => physicalFileName.Replace(physicalPath, directoryVirtualPath).Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)) 
      .Where(virtualFileName => !filesToExclude.Contains(virtualFileName)) 
      .ToArray()); 
    } 
} 
4

我已經喬恩·馬爾科姆提高了很好的建議(和Satpal here一些更新)來修復一些缺點,它有:

1)它打破了捆綁的默認行爲與」 .min 「。文件

2)它不允許搜索模式,但是隻有文件被排除

using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.Optimization; 


public static class BundleExtentions 
{ 
    public static Bundle IncludeDirectoryWithExclusion(this Bundle bundle, string directoryVirtualPath, string searchPattern, bool includeSubDirectories, params string[] excludePatterns) 
    { 
     string folderPath = HttpContext.Current.Server.MapPath(directoryVirtualPath); 

     SearchOption searchOption = includeSubDirectories 
             ? SearchOption.AllDirectories 
             : SearchOption.TopDirectoryOnly; 

     HashSet<string> excludedFiles = GetFilesToExclude(folderPath, searchOption, excludePatterns); 
     IEnumerable<string> resultFiles = Directory.GetFiles(folderPath, searchPattern, searchOption) 
                .Where(file => !excludedFiles.Contains(file) && !file.Contains(".min.")); 

     foreach (string resultFile in resultFiles) 
     { 
      bundle.Include(directoryVirtualPath + resultFile.Replace(folderPath, "") 
        .Replace("\\", "/")); 
     } 

     return bundle; 
    } 

    private static HashSet<string> GetFilesToExclude(string path, SearchOption searchOptions, params string[] excludePatterns) 
    { 
     var result = new HashSet<string>(); 

     foreach (string pattern in excludePatterns) 
     { 
      result.UnionWith(Directory.GetFiles(path, pattern, searchOptions)); 
     } 

     return result; 
    } 
} 

一個例子使用,我已是包括所有從lib文件夾的庫開始角度,但不包括所有語言環境的腳本(因爲只有一個將被添加基於在一個單獨的包後的語言):

bundles.Add(new Bundle("~/bundles/scripts") 
       .Include("~/wwwroot/lib/angular/angular.js") // Has to be first 
       .IncludeDirectoryWithExclusion("~/wwwroot/lib", "*.js", true, "*.locale.*.js")); 

這會循規蹈矩,如果你有兩個angular.min.js和angular.js並添加unminified版本調試和使用r中現有的.min.js聞稿。

+0

謝謝!這個答案也解決了我捆綁的問題。 –