asp.net mvc exclure fichier css de bundle

j'ai un tel bundle

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

mais je veux exclure un fichier css. est-il possible de le faire sans spécifier chaque fichier css dans bundle?

24
demandé sur xurca 2012-12-21 16:55:19

4 réponses

Essayez d'utiliser IgnoreList.Ignorer;bundles.IgnoreList.Ignore(...).

36
répondu CoffeeCode 2015-12-18 21:25:13

Une méthode d'extension pourrait être ce dont vous avez besoin ici:

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

Et puis l'utilisation devrait être:

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

Je ne suis pas à un PC en ce moment donc ce qui précède n'est pas testé mais devrait vous donner un modèle pour votre solution.

13
répondu Jon Malcolm 2012-12-21 14:41:49

j'ai amélioré la bonne suggestion de Jon Malcolm (et quelques mises à jour de Satpal ici) pour corriger quelques défauts qu'elle avait:

1) Il rompt le comportement par défaut des paquets avec ".min."les fichiers

2) Il ne permet pas les modèles de recherche, mais seulement les fichiers à exclure

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 exemple d'utilisation que j'ai est d'inclure toutes les bibliothèques du dossier lib en commençant par angular, mais en excluant tous les scripts de locale (parce que seulement on va être ajoutés en fonction de la langue dans un autre bundle plus tard):

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

cela se comportera correctement si vous avez les deux angulaires.min.js et angulaire.js et ajouter unminified version de débogage et de partir de l'existant .min.js dans le communiqué.

4
répondu Ilya Chernomordik 2017-05-23 12:26:05

Voici une autre méthode d'extension qui surcharge l'existant IncludeDirectory méthodes et supports de recherche de sous-répertoires.

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());
    }
}
1
répondu Lucifer Sam 2015-08-25 18:00:18