7

私は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" となります。

どうですか?

4

1 に答える 1

3

複雑すぎる - Request オブジェクトは Application_Start で利用できます。使用するだけです:

var host = Request.Url.Host;

バンドルを登録する前に、返された値に基づいてバンドルを条件付きで登録します。

更新 すべてのバンドルをドメイン キーに登録します。

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)
于 2013-01-05T02:32:04.447 に答える