Я новичок в 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».
Как это?
Но я подозреваю, что этого недостаточно. Application_Start вызывается только при запуске приложения, несколько доменов в одном приложении означают, что он запускается по первому запросу из одного из домена, но по последующим запросам из других доменов? –
вы собираетесь съесть тонну процессорного времени, пытаясь объединить и оптимизировать каждый запрос, более чем вероятно замедляя ваш ответ и побеждая цель объединения/минимизации. Вам будет лучше скомпоновать/свести к минимуму все ваши пакеты с конкретным доменом один раз, а затем использовать макет и/или контроллер для выбора нужного пакета. – viperguynaz
Я бы рекомендовал сделать это в макете, несколько простых утверждений if, и все готово. Я не поклонник логики в макете, представлении и т. Д., Но это хорошее исключение. –