私はMVCが初めてです。
バンドルの作成方法は知っています。簡単で、優れた機能です。
bundles.Add(new StyleBundle("~/content/css").Include(
"~/content/main.css",
"~/content/footer.css",
"~/content/sprite.css"
));
しかし、アプリケーションがさまざまなドメインでアクセス可能であり、ホスト名に応じてさまざまな CSS でさまざまなコンテンツを提供しているとします。
ホスト名に応じて異なるファイルをバンドルに含めるにはどうすればよいですか? 私のRegisterBundlesがあるアプリケーションの開始では(私が始めたMVC標準のインターネットアプリケーションのように)、ホスト名さえまだ知りません。
ベストプラクティスは何ですか?
バンドルを登録するときにホスト名を使用できる場合は、現在のホスト名に適した .css ファイルを選択できます。たとえば、アプリケーションの開始リクエストでバンドルを登録し、すでに登録されているかどうかを何らかの形で確認し、登録されていない場合は、リクエストのホスト名に適したファイルを選択して登録できますか?
はいの場合、どのように?
編集1
過去 2 時間で、このトピックをもう少し深く調査しました。間違っている場合は、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 は、ホスト名から第 2 レベル ドメインを返すだけなので、GetUpToSecondLevelDomain("www.foo.bar.com") = "bar.com" となります。
どうですか?