asp.net mvc исключить файл css из пакета

у меня есть такая пачка

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

но я хочу исключить из него один файл CSS.

Можно ли сделать это без указания каждого файла CSS в комплекте?


person xurca    schedule 21.12.2012    source источник
comment
Почему бы вам просто не переместить файл css из этого каталога?   -  person Gaz Winter    schedule 21.12.2012
comment
ну конечно я могу сделать так и указать другой бандл для этого файла, но было бы лучше чтобы все файлы были в одном каталоге и если он мне не нужен я его просто исключим из бандла   -  person xurca    schedule 21.12.2012
comment
У вас много файлов? Вы можете зарегистрировать каждый css отдельно, если у вас небольшое количество файлов.   -  person Brian Mains    schedule 21.12.2012
comment
у меня есть около 20 файлов, но, например, если я добавлю к нему новый файл, мне нужно будет зарегистрировать этот файл в комплекте ... и таким образом я мог бы только исключить ненужные и не беспокоиться об именах   -  person xurca    schedule 21.12.2012


Ответы (4)


Попробуйте использовать IgnoreList.Ignore ; bundles.IgnoreList.Ignore(...).

person CoffeeCode    schedule 21.12.2012
comment
Хороший пример см.: stack247. .wordpress.com/2014/04/18/ - person Kildareflare; 10.05.2016
comment
Это плохой ответ. Он не объясняет, как использовать «Игнорировать» или как получить к нему доступ. Это просто ссылка на какую-то плохую документацию с крошечным фрагментом, который не объясняет ни одну из особенностей здесь. Комментарий о сайте wordpress — самая полезная вещь здесь. - person Liam; 01.09.2017

Здесь вам может понадобиться метод расширения:

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"));

В данный момент я не на ПК, поэтому приведенное выше не проверено, но должно дать вам шаблон для вашего решения.

person Jon Malcolm    schedule 21.12.2012
comment
Я расширил этот ответ, чтобы добавить шаблоны поиска и исправить недостатки версии .min здесь: /а> - person Ilya Chernomordik; 18.03.2016

Я улучшил хорошее предложение Джона Малкольма (и некоторые обновления Satpal здесь), чтобы исправить несколько недостатков, которые у него были:

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, начиная с angular, но исключая все сценарии локали (потому что позже будет добавлен только один на основе языка в отдельном пакете):

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, и вы добавите неминифицированную версию в отладку и используете существующий .min.js в выпуске.

person Ilya Chernomordik    schedule 18.03.2016
comment
Спасибо! Этот ответ также решил проблему, с которой я столкнулся. - person Jerod Houghtelling; 19.03.2016

Вот еще один метод расширения, который перегружает существующие методы 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());
    }
}
person Jeff Camera    schedule 25.08.2015