2012-07-20 49 views
14

Tôi mới bắt đầu làm việc với VS 2012 RC. Tôi đã tạo một trang thử nghiệm với một trang chính và một biểu mẫu web duy nhất. Hiện nay, tôi đang sử dụng mã này để gói toàn bộ Styles folder on the site:Visual Studio 2012 Bundled có điều kiện

Global.asax

BundleTable.Bundles.EnableDefaultBundles(); 

Site.Master

<link rel="stylesheet" type="text/css" href="Styles/css" /> 

Câu hỏi: Trang web thử nghiệm có tệp CSS cấp trang web kiểm soát giao diện tổng thể của trang web. Ngoài CSS cấp trang web, mỗi trang có thể có định nghĩa CSS của riêng chúng. Chỉ có thể bao gồm tệp site.css trong trang chính và sau đó thêm các tệp .css có điều kiện vào gói theo từng trang yêu cầu?

tôi đã cố gắng này trong mã đằng sau của Default.aspx nhưng nó đã không làm việc:

BundleTable.Bundles.Add(new Bundle("~/Styles/Default.css")); 
+0

Nếu bạn chỉ tải site.css trong tổng thể và sau đó một trang tập tin css, thì tại sao bạn bundling? –

+0

@TimBJames, I * đã * tải nội dung của toàn bộ thư mục.Tôi chỉ muốn tải CSS cấp trang web trong trang chính và sau đó gộp các tệp CSS bổ sung với nó khi cần thiết. –

+0

đọc sách này lần đầu tiên. Điều này không đánh bại mục đích của việc đóng gói? Sau khi tất cả, mà không có bundling bạn sẽ tải site.css và page1.css trong lần tải đầu tiên, sau đó khi đi đến trang 2 nó sẽ chỉ tải page2.css, page3.css cho trang 3, vv Giả sử rằng các tệp CSS cụ thể của trang thường nhỏ hơn nhiều so với trang web chung, với gói bạn sẽ tải một tệp lớn khác trong mỗi trang và không cần gói, bạn sẽ tải một tệp nhỏ trong mỗi trang, chỉ cải tiến mới là trang đầu tiên bạn muốn tải 1 tập tin thay vì 2 (cùng kích thước) – Rodolfo

Trả lời

7

Đề nghị của tôi:

Chuyển đến Global.asax. Đảm bảo phương pháp Application_Start chứa dòng sau:

protected void Application_Start() 
{ 
    ... 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

Tìm hoặc tạo lớp BundleConfig như sau, tốt hơn trong thư mục App_Start:

public class BundleConfig 
{ 
    public static void RegisterBundles(BundleCollection bundles) 
    { 
     ... 

     bundles.Add(new StyleBundle("~page1").Include(
      "~/Styles/site.css", 
      "~/Styles/page1.css")); 

     bundles.Add(new StyleBundle("~page2").Include(
      "~/Styles/site.css", 
      "~/Styles/page2.css")); 

     ... 

     bundles.Add(new StyleBundle("~pageN").Include(
      "~/Styles/site.css", 
      "~/Styles/pageN.css")); 

    } 
} 

Bây giờ sử dụng gói tương ứng trong mỗi trang thích hợp:

<link rel="stylesheet" type="text/css" href="Styles/page1" /> 

Hoặc tốt hơn từ mã:

@Styles.Render("~/Styles/page1") 

(đây là cshtml, nhưng cú pháp aspx là chắc chắn rất giống nhau).

Lưu ý rằng bạn phải có một gói riêng trên mỗi trang. Bạn không nên sửa đổi một và cùng một gói trên bay. Các gói có Url ảo. Trong ví dụ của bạn, nó chỉ là css. Các trình duyệt này được lưu trong bộ nhớ cache, vì vậy bất kể thời tiết bạn đã thay đổi nội dung của gói khi đang duyệt thì trình duyệt có thể cho rằng điều này giống nhau và không tìm nạp lại.


Nếu bạn không muốn để chăm sóc về việc thêm mỗi trang bằng tay để các phương pháp trên. Bạn có thể tự động hóa nó. mã sau đây có thể cung cấp cho bạn một ý tưởng như thế nào:

public class MyStyleHelper 
{ 
    public static string RenderPageSpecificStyle(string pagePath) 
    { 
     var pageName = GetPageName(pagePath); 
     string bundleName = EnsureBundle(pageName); 
     return bundleName; 
    } 

    public static string GetPageName(string pagePath) 
    { 
     string pageFileName = pagePath.Substring(pagePath.LastIndexOf('/')); 
     string pageNameWithoutExtension = Path.GetFileNameWithoutExtension(pageFileName); 
     return pageNameWithoutExtension; 
    } 

    public static string EnsureBundle(string pageName) 
    { 
     var bundleName = "~/styles/" + pageName; 
     var bundle = BundleTable.Bundles.GetBundleFor(bundleName); 
     if (bundle == null) 
     { 
      bundle = new StyleBundle(bundleName).Include(
       "~/styles/site.css", 
       "~/styles/" + pageName + ".css"); 
      BundleTable.Bundles.Add(bundle); 
     } 
     return bundleName; 
    } 
} 

Cách sử dụng:

<link rel="stylesheet" type="text/css" href="<%: MyStyleHelper.RenderPageSpecificStyle(Page.AppRelativeVirtualPath) %>" /> 
+0

Tôi có sai, hoặc ví dụ tự động hóa của bạn cho rằng đây là một ứng dụng MVC? –

+0

Xin chào James Hill, vâng bản nháp nhanh đầu tiên của tôi ** là ** MVC. Đó là notepad mã hóa và đã có một số lỗi cũng. Bây giờ tôi viết lại nó thành ASP đơn giản và thử nghiệm. Có vẻ như để làm việc tốt. Vui lòng xem các chỉnh sửa của tôi. –

+0

FYI - 'ResolveUrl()' sẽ được thêm vào cách sử dụng của bạn. Nó sẽ không làm việc nếu không có nó. –

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