2013-01-04 4 views
7

Я новичок в MVC.Пакеты MVC4 по имени хоста

Я знаю, как создать связки, это легко, и это отличная возможность:

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

Но, допустим, ваше приложение доступно в различных доменах и обслуживающих различное содержание с различными CSS в зависимости от имени хоста.

Как вы можете связать разные файлы в зависимости от имени хоста? В начале приложения, где мой RegisterBundles (как в стандартном интернет-приложении MVC, с которого я начал), я даже не знаю имя хоста.

Каковы наилучшие методы?

Если у меня было имя хоста, доступное при регистрации пакетов, я мог бы выбрать правильный .css-файл для текущего имени хоста. Могу ли я зарегистрировать пакеты для запроса на запуск приложения, например, и как-то проверить, была ли она уже зарегистрирована, а если нет, выбрать правильные файлы для имени хоста запроса и зарегистрировать его?

Если да, то как?

EDIT 1

В последние два часа я исследовал эту тему немного глубже, позвольте мне предложить свое решение с надеждой, кто больше специалист, чем я с MVC может исправить свой подход, если не так.

я заменил:

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

с:

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

Что только простой помощник:

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

Где RefreshBundleFor является:

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

И GetUpToSecondLevelDomain просто возвращает домен второго уровня из имени хоста, поэтому GetUpToSecondLevelDomain («www.foo.bar.com») = «bar.com».

Как это?

ответ

3

Сложный - объект Request доступен в Application_Start. Просто используйте:

var host = Request.Url.Host; 

Прежде чем регистрировать свои связки и условно зарегистрировать базу связок на возвращаемом значении.

UPDATE Регистрация все, что связывает с помощью ключа домена:

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

Затем в базовом контроллере, что все контроллеры унаследовать вы можете создать имя пакета, чтобы перейти к просмотру:

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

, а затем на макете или виде:

@Styles.Render(ViewBag.BundleName) 
+0

Но я подозреваю, что этого недостаточно. Application_Start вызывается только при запуске приложения, несколько доменов в одном приложении означают, что он запускается по первому запросу из одного из домена, но по последующим запросам из других доменов? –

+0

вы собираетесь съесть тонну процессорного времени, пытаясь объединить и оптимизировать каждый запрос, более чем вероятно замедляя ваш ответ и побеждая цель объединения/минимизации. Вам будет лучше скомпоновать/свести к минимуму все ваши пакеты с конкретным доменом один раз, а затем использовать макет и/или контроллер для выбора нужного пакета. – viperguynaz

+0

Я бы рекомендовал сделать это в макете, несколько простых утверждений if, и все готово. Я не поклонник логики в макете, представлении и т. Д., Но это хорошее исключение. –

Смежные вопросы