2013-01-04 13 views
7

Jestem nowy w MVC.Pakiety MVC4 według nazwy hosta

wiem, jak tworzyć pakiety, łatwo i jest to świetna cecha:

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

Ale powiedzmy, że aplikacja jest dostępna pod różnymi domenami i obsługujących różne treści z inna css w zależności od nazwy hosta.

W jaki sposób pakiet może zawierać różne pliki w zależności od nazwy hosta? W uruchomieniu aplikacji, gdzie znajduje się mój RegisterBundles (jak w standardowej aplikacji internetowej MVC, od której zacząłem), nie znam jeszcze nazwy hosta.

Jakie są najlepsze praktyki?

Gdybym miał nazwę hosta dostępną podczas rejestrowania pakietów, mógłbym wybrać właściwy plik .css dla bieżącej nazwy hosta. Czy mogę zarejestrować pakiety na wniosek, rozpocząć żądanie dla instancji, i jakoś sprawdzić, czy był już zarejestrowany, a jeśli nie, wybrać właściwe pliki dla nazwy hosta żądania i zarejestrować go?

Jeśli tak, w jaki sposób?

EDIT 1

W ciągu ostatnich dwóch godzin badałem ten temat nieco głębiej, pozwól mi zaproponować moje rozwiązanie z nadziejami kto jest bardziej niż mnie ekspert z MVC może skorygować moje podejście jeśli źle.

Wymieniłem:

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

z:

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

Który jest tylko prosty pomocnik:

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

Gdzie RefreshBundleFor jest:

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

A GetUpToSecondLevelDomain właśnie zwraca domenę drugiego poziomu z nazwy hosta, więc GetUpToSecondLevelDomain ("www.foo.bar.com") = "bar.com".

Jak to jest?

Odpowiedz

3

Zbyt skomplikowane - obiekt Żądanie jest dostępny w Application_Start. Po prostu użyj:

var host = Request.Url.Host; 

zanim zarejestrujesz swoje pakiety i warunkowo zarejestrujesz swoje pakiety na podstawie zwróconej wartości.

UPDATE Rejestracja wszystko co wiązki za pomocą klucza domeny:

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

Następnie w kontroler bazowej że wszystkie kontrolery dziedziczenia można zbudować nazwę wiązki przejść do widoku:

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

, a następnie w układzie lub widoku:

@Styles.Render(ViewBag.BundleName) 
+0

Ale podejrzewam, że to za mało. Application_Start jest wywoływana właśnie podczas uruchamiania aplikacji, wiele domen w tej samej aplikacji oznacza, że ​​zaczyna się na pierwszym żądaniu z jednej domeny, ale na kolejnych żądaniach z innych domen? –

+0

zamierzasz pochłaniać mnóstwo czasu procesora, próbując łączyć i optymalizować na każde żądanie, bardziej niż prawdopodobne spowolnienie reakcji i pokonanie celu łączenia/minimalizowania. Lepiej będzie spakować/zminimalizować wszystkie pakiety specyficzne dla danej domeny, a następnie użyć układu i/lub kontrolera, aby wybrać odpowiedni pakiet. – viperguynaz

+0

Polecam zrobić to w układzie, kilka prostych instrukcji if i gotowe. Nie jestem fanem logiki w układzie, widoku itp., Ale jest to dobry wyjątek. –