2013-01-04 27 views
7

Tôi mới tham gia MVC.Gói MVC4 theo tên máy chủ

tôi biết làm thế nào để tạo ra bó, thật dễ dàng và đó là một tính năng tuyệt vời:

bundles.Add(new StyleBundle("~/content/css").Include(
    "~/content/main.css", 
    "~/content/footer.css", 
    "~/content/sprite.css" 
    )); 

Nhưng giả sử ứng dụng của bạn có thể truy cập dưới lĩnh vực khác nhau và phục vụ nội dung khác nhau với css khác nhau tùy thuộc vào tên máy chủ.

Làm cách nào để bạn có một gói bao gồm các tệp khác nhau tùy thuộc vào tên máy chủ lưu trữ? Trong ứng dụng bắt đầu, nơi RegisterBundles của tôi (giống như trong ứng dụng internet tiêu chuẩn MVC tôi bắt đầu với) Tôi thậm chí không biết tên máy chủ.

Thực tiễn tốt nhất là gì?

Nếu tôi có tên máy chủ lưu trữ khi đăng ký các gói, tôi có thể chọn đúng tệp .css cho tên máy chủ lưu trữ hiện tại. Tôi có thể đăng ký các gói trên ứng dụng bắt đầu yêu cầu chẳng hạn, và bằng cách nào đó kiểm tra xem nó đã được đăng ký chưa và chọn đúng tệp cho tên máy chủ của yêu cầu và đăng ký không?

Nếu có, làm cách nào?

EDIT 1

Trong hai giờ cuối cùng tôi điều tra chủ đề này sâu hơn một chút, hãy để tôi đề xuất giải pháp của tôi với hy vọng là người chuyên gia hơn tôi với MVC có thể sửa cách tiếp cận của tôi nếu sai.

tôi thay thế:

@Styles.Render("~/Content/css") 

với:

@Html.DomainStyle("~/Content/css") 

Đó là chỉ là một helper đơn giản:

public static class HtmlExtensions 
{ 
    public static IHtmlString DomainStyle(this HtmlHelper helper, string p) 
    { 
    string np = mynamespace.BundleConfig.RefreshBundleFor(System.Web.Optimization.BundleTable.Bundles, "~/Content/css"); 

    if (!string.IsNullOrEmpty(np)) 
     return Styles.Render(np); 
    else 
    { 
     return Styles.Render(p); 
    } 
    } 
} 

đâu RefreshBundleFor là:

public static string RefreshBundleFor(BundleCollection bundles, string p) 
{ 
    if (bundles.GetBundleFor(p) == null) 
    return null; 

    string domain = mynamespace.Utilities.RequestUtility.GetUpToSecondLevelDomain(HttpContext.Current.Request.Url); 

    string key = p + "." + domain; 

    if (bundles.GetBundleFor(key) == null) 
    { 
    StyleBundle nb = new StyleBundle(key); 

    Bundle b = bundles.GetBundleFor(p); 
    var bundleContext = new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, p); 

    foreach (FileInfo file in b.EnumerateFiles(bundleContext)) 
    { 
     string nf = file.DirectoryName + "\\" + Path.GetFileNameWithoutExtension(file.Name) + "." + domain + file.Extension; 
     if (!File.Exists(nf)) 
     nf = file.FullName; 

     var basePath = HttpContext.Current.Server.MapPath("~/"); 
     if (nf.StartsWith(basePath)) 
     { 
     nb.Include("~/" + nf.Substring(basePath.Length)); 
     } 
    } 
    bundles.Add(nb); 
    } 

    return key; 
} 

Và GetUpToSecondLevelDomain chỉ trả lại tên miền cấp thứ hai ra khỏi tên máy chủ, vì vậy GetUpToSecondLevelDomain ("www.foo.bar.com") = "bar.com".

Làm thế nào?

Trả lời

3

Quá phức tạp - đối tượng Yêu cầu có sẵn trong Application_Start. Chỉ cần sử dụng:

var host = Request.Url.Host; 

trước khi bạn đăng ký gói và đăng ký điều kiện dựa trên giá trị được trả về.

CẬP NHẬT Đăng ký tất cả các bạn bó với một khóa tên miền:

StyleBundle("~/content/foo1.css")... 
StyleBundle("~/content/foo2.css")... 

Sau đó, trong một bộ điều khiển cơ sở rằng tất cả các bộ điều khiển kế thừa bạn có thể xây dựng tên bó để vượt qua các điểm:

var host = Request.Url.Host; // whatever code you need to extract the domain like Split('.')[1] 
ViewBag.BundleName = string.Format("~/content/{0}.css", host); 

và sau đó trong bố cục hoặc chế độ xem:

@Styles.Render(ViewBag.BundleName) 
+0

Nhưng tôi nghi ngờ là không đủ. Application_Start được gọi chỉ khi ứng dụng được khởi động, nhiều tên miền trên cùng một ứng dụng có nghĩa là nó bắt đầu theo yêu cầu đầu tiên từ một trong các tên miền, nhưng trên các yêu cầu tiếp theo từ các tên miền khác? –

+0

bạn sẽ được ăn một tấn thời gian CPU cố gắng để bó và tối ưu hóa trên mọi yêu cầu, nhiều hơn khả năng làm chậm phản ứng của bạn và đánh bại mục đích của bundling/minimizing. Bạn sẽ được giảm giá tốt hơn/giảm thiểu tất cả các gói miền cụ thể của mình một lần và sau đó sử dụng bố cục và/hoặc bộ điều khiển để chọn gói phù hợp. – viperguynaz

+0

Tôi khuyên bạn nên thực hiện nó trong bố cục, một vài câu lệnh if đơn giản và bạn đã hoàn thành. Tôi không phải là một fan hâm mộ của logic trong một bố trí, xem, vv, nhưng đây là một ngoại lệ tốt. –