在控制器

时间:2017-04-04 16:09:24

标签: html css asp.net-mvc twitter-bootstrap

我想将一个css名称加载到一个会话变量中,然后让它在_Layout.cshtml上加载一个css。

这是我试图做的事情:

  var companycss = string.Format("~/Content/CompanyFiles/{0}/{0}.css", MySession.CssName);

  bundles.Add(new StyleBundle("~/Content/css").Include(
    "~/Content/bootstrap.css",
    "~/Content/site.css",
    "~/Content/justified-nav.css",
    "~/Content/Styles.css",
    companycss)); // <-- Custom CSS file

BundleConfig.cs显然在我的HomeController中的index方法之前加载,所以它没有加载这个样式表。

在我的Index方法中,我正在加载MySession.CssName并希望它能正确加载到页面中,因为我决定在客户访问网站时加载哪个css。

有关如何完成此任务的任何建议?

谢谢!

1 个答案:

答案 0 :(得分:0)

除非你为每家公司创建一个静态捆绑包,否则在这里实现你想要的东西几乎是不可能的。换句话说,您不能依赖BundleConfig.cs中的会话,但可以通过会话变量引用布局中的其他包。该捆绑包必须已经定义。

或者,如果您不介意加载两个包,则可以在视图中动态创建一个包。您基本上只是让您的~/Content/css捆绑包括除公司CSS文件之外的所有CSS。然后你可以做类似的事情:

@{ BundleTable.Bundles.Add(new StyleBundle(String.Format("~/bundles/{0}", MySession.CssName)).Include(String.Format("~/Content/CompanyFiles/{0}/{0}.css", MySession.CssName))); }
@Styles.Render(String.Format("~/bundles/{0}", MySession.CssName))

这将为此特定公司的CSS添加新捆绑包,然后加载它。你最终会加载两个样式表而不是一个,但它们都会被缩小。

修改

我之前从未考虑过这个问题,但您可以将BundleConfig.cs中的代码与后一个选项相结合,并实现单个捆绑。但是,您实际上已将代码从BundleConfig.cs转移到您的布局中。有些人可能认为这是一种失礼,它肯定会践踏MVC模式的原则。不过,为了完整性:

@{
    var companycss = string.Format("~/Content/CompanyFiles/{0}/{0}.css", MySession.CssName);

    BundleTable.Bundles.Add(new StyleBundle("~/Content/css").Include(
        "~/Content/bootstrap.css",
        "~/Content/site.css",
        "~/Content/justified-nav.css",
        "~/Content/Styles.css",
        companycss)); // <-- Custom CSS file
}
@Styles.Render("~/Content/css")