2012-12-21 15 views
23

mam taką wiązkęASP.NET MVC wykluczyć plik CSS z wiązki

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

ale chcę wykluczyć jednego pliku css od niego. jest to możliwe bez określania każdego pliku css w pakiecie?

+1

Dlaczego po prostu nie przeniesiesz pliku css z tego katalogu? –

+1

oczywiście mogę to zrobić i określić inny pakiet dla tego pliku, ale lepiej byłoby mieć wszystkie pliki w jednym katalogu, a jeśli go nie potrzebuję, po prostu wyłączę go z pakietu – xurca

+0

Czy masz dużo plików? Możesz zarejestrować każdą css indywidualnie, jeśli masz niewielką liczbę plików. –

Odpowiedz

34

Spróbuj użyć IgnoreList.Ignore; bundles.IgnoreList.Ignore(...).

+2

Dla miłego przykładu zobacz : https://stack247.wordpress.com/2014/04/18/asp-net-mvc-4-bundles-ignore-list/ – Kildareflare

+0

To jest słaba odpowiedź. Nie wyjaśnia, w jaki sposób korzystać z funkcji Ignoruj ​​lub jak uzyskać do niej dostęp. To tylko link do jakiejś marnej dokumentacji z małym fragmentem, który nie wyjaśnia tu żadnych dziwactw. Komentarz na temat strony z wordpress jest tutaj najbardziej przydatny. – Liam

13

metodę rozszerzenia może być, co trzeba tutaj:

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; 
} 

A potem wykorzystanie powinno być:

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

nie jestem przy komputerze w tej chwili więc powyższe jest nie- testowany, ale powinien dać ci szablon do rozwiązania.

+0

Rozszerzyłem tę odpowiedź, aby dodać wzorce wyszukiwania i naprawić niedociągnięcia w wersji .min tutaj: http://stackoverflow.com/a/36080620/1671558 –

1

Oto kolejna metoda rozszerzenia, która powoduje przeciążenie istniejących metod IncludeDirectory i obsługuje wyszukiwanie w podkatalogach.

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

I poprawiły dobrą sugestię Jon Malcolm (i niektóre aktualizacje przez Satpal here), aby rozwiązać kilka niedociągnięć, że w przeszłości:

1) Łamie domyślne zachowanie wiązek z”.min . " Pliki

2) nie pozwala wzorce wyszukiwania, ale tylko pliki mają być wyłączone

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; 
    } 
} 

Przykładem użycia że mam ma zawierać wszystkie biblioteki z folderu lib zaczynając kanciasty, ale z wyłączeniem wszystkich skrypty locale (bo tylko jeden zostanie dodana opiera się na języku w osobnym pakiecie później):

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

ten będzie zachowywał się poprawnie, jeśli masz oba angular.min.js i angularjs i dodać w wersji unminified debugowanie i używanie istniejącego .min.js w r elease.

+0

Dziękuję! Ta odpowiedź rozwiązała również problem, który miałem z łączeniem. –