MVC4按主机名捆绑

Max*_*lli 7 c# bundle asp.net-mvc-4

我是MVC的新手.

我知道如何创建捆绑包,它很简单,它是一个很棒的功能:

  bundles.Add(new StyleBundle("~/content/css").Include(
    "~/content/main.css",
    "~/content/footer.css",
    "~/content/sprite.css"
    ));
Run Code Online (Sandbox Code Playgroud)

但是,假设您的应用程序可以在不同的域下访问,并根据主机名为不同的css提供不同的内容.

如何根据主机名包含不同的文件包?在我的RegisterBundles所在的应用程序启动中(就像我开始使用的MVC标准的Internet应用程序),我甚至都不知道主机名.

什么是最佳做法?

如果我在注册捆绑包时可以使用主机名,我可以为当前主机名选择正确的.css文件.我可以在应用程序开始请求中注册bundle,并以某种方式检查它是否已经注册,如果没有,请选择正确的文件作为请求的主机名并注册它?

如果有,怎么样?

编辑1

在过去的两个小时里,我更深入地研究了这个主题,让我提出我的解决方案,希望谁比我更专业,MVC可以纠正我的方法,如果错误的话.

我换了:

@Styles.Render("~/Content/css")
Run Code Online (Sandbox Code Playgroud)

有:

@Html.DomainStyle("~/Content/css")
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的帮手:

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

而GetUpToSecondLevelDomain只是从主机名返回第二级域,因此GetUpToSecondLevelDomain("www.foo.bar.com")="bar.com".

如何?

vip*_*naz 3

过于复杂 - Request 对象在 Application_Start 中可用。只需使用:

var host = Request.Url.Host;
Run Code Online (Sandbox Code Playgroud)

在注册您的捆绑包之前,并根据返回的值有条件地注册您的捆绑包。

更新 使用域密钥注册所有捆绑包:

StyleBundle("~/content/foo1.css")...
StyleBundle("~/content/foo2.css")...
Run Code Online (Sandbox Code Playgroud)

然后,在所有控制器继承的基本控制器中,您可以构建要传递给视图的包名称:

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

然后在布局或视图中:

@Styles.Render(ViewBag.BundleName)
Run Code Online (Sandbox Code Playgroud)