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?
4 réponses
Essayez d'utiliser IgnoreList.Ignorer;bundles.IgnoreList.Ignore(...)
.
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.
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é.
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());
}
}