2012-12-21 30 views
23

tôi có bó nhưMVC asp.net loại trừ tập tin css từ bó

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

nhưng tôi muốn loại bỏ một file css từ nó. có thể thực hiện điều này mà không chỉ định từng tệp css trong gói không?

+1

Tại sao bạn không chuyển tệp css ra khỏi thư mục đó? –

+1

cũng tất nhiên tôi có thể làm như vậy và chỉ định một gói cho tệp này, nhưng tốt hơn là nên có tất cả các tệp trong một thư mục và nếu tôi không cần nó, tôi sẽ loại trừ nó khỏi gói – xurca

+0

Bạn có rất nhiều tệp? Bạn có thể đăng ký từng css riêng lẻ nếu bạn có một số lượng nhỏ các tệp. –

Trả lời

34

Thử sử dụng IgnoreList.Ignore; bundles.IgnoreList.Ignore(...).

+2

Để có ví dụ hay, hãy xem : https://stack247.wordpress.com/2014/04/18/asp-net-mvc-4-bundles-ignore-list/ – Kildareflare

+0

Đây là câu trả lời nghèo nàn. Nó không giải thích cách sử dụng Ignore hoặc cách truy cập nó. Nó chỉ là một liên kết đến một số tài liệu nghèo nàn với một đoạn mã nhỏ giải thích không có sự đồng nhất ở đây. Nhận xét về trang wordpress là điều hữu ích nhất ở đây. – Liam

13

Một phương pháp khuyến nông có thể là những gì bạn cần ở đây:

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

Và sau đó sử dụng nên:

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

Tôi không ở một máy tính vào lúc này nên ở trên là un- thử nghiệm nhưng nên cung cấp cho bạn một mẫu cho giải pháp của bạn.

+0

Tôi đã mở rộng câu trả lời này để thêm các mẫu tìm kiếm và sửa các lỗi còn tồn tại thành phiên bản .min tại đây: http://stackoverflow.com/a/36080620/1671558 –

1

Đây là một phương pháp mở rộng khác đang quá tải các phương thức IncludeDirectory hiện có và hỗ trợ tìm kiếm các thư mục con.

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

tôi đã được cải thiện các gợi ý tốt bởi Jon Malcolm (và một số cập nhật bởi Satpal here) để sửa chữa vài hạn chế mà nó có:

1) Nó phá vỡ các hành vi mặc định của các bó với" .min . " file

2) Nó không cho phép các mẫu tìm kiếm, nhưng chỉ file được loại trừ

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

Một cách sử dụng ví dụ mà tôi có là bao gồm tất cả các thư viện từ thư mục lib bắt đầu với góc cạnh, nhưng không bao gồm tất cả các kịch bản locale (vì chỉ có một sẽ được bổ sung dựa trên ngôn ngữ trong một gói riêng biệt sau):

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

này sẽ cư xử đúng nếu bạn có cả angular.min.js và angular.js và thêm phiên bản unminified trong gỡ lỗi và sử dụng tệp .min.js hiện có trong r elease.

+0

Cảm ơn bạn! Câu trả lời này cũng đã giải quyết được vấn đề tôi đang gặp phải. –

Các vấn đề liên quan