2012-12-21 16 views
23

ho tale fasciomvc asp.net escludere file css dal fascio

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

ma voglio escludere un file css da esso. è possibile farlo senza specificare ogni file css in bundle?

+1

Perché non spostare semplicemente il file css da quella directory? –

+1

beh, naturalmente posso farlo e specificare un altro pacchetto per questo file, ma sarebbe meglio avere tutti i file in una directory e se non ne ho bisogno, lo escluderò semplicemente dal pacchetto – xurca

+0

Hai un sacco di file? È possibile registrare ciascun css singolarmente se si dispone di un numero limitato di file. –

risposta

34

Provare a utilizzare IgnoreList.Ignore; bundles.IgnoreList.Ignore(...).

+2

Per un bel esempio vedi : https://stack247.wordpress.com/2014/04/18/asp-net-mvc-4-bundles-ignore-list/ – Kildareflare

+0

Questa è una risposta scarsa. Non spiega come usare Ignora o come accedervi. È solo un collegamento ad una documentazione scadente con un piccolo frammento che non spiega nessuna delle idiosincrasie qui. Il commento sul sito wordpress è la cosa più utile qui. – Liam

13

un metodo di estensione potrebbe essere quello che vi serve qui:

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

E poi l'uso dovrebbe essere:

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

Io non sono in un PC al momento quindi il sopra è ONU testato ma dovrebbe darti un modello per la tua soluzione.

+0

Ho esteso questa risposta per aggiungere schemi di ricerca e correggere le mancanze alla versione .min qui: http://stackoverflow.com/a/36080620/1671558 –

1

Ecco un altro metodo di estensione che sovraccarica i metodi esistenti IncludeDirectory e supporta la ricerca di sottodirectory.

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

ho migliorato il buon suggerimento da Jon Malcolm (e alcuni aggiornamenti di Satpal here) per risolvere alcune carenze che aveva:

1) Si rompe il comportamento predefinito dei fasci con" .min ". file

2) non consentono modelli di ricerca, ma solo i file da escludere

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

Un esempio d'uso che ho è di includere tutte le librerie dalla cartella lib iniziando con angolare, ma escludendo ogni gli script di locale (perché saranno aggiunti un solo basano sulla lingua in un fascio separata in seguito):

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

Ciò comportarsi correttamente se si dispone di entrambe le angular.min.js e angular.js e aggiungere la versione unminified in eseguire il debug e utilizzare il file .min.js esistente nella r Elease.

+0

Grazie! Questa risposta ha risolto anche un problema che avevo con il bundling. –

Problemi correlati