4

我的网站上有一些页面使用某些 CSS 和 JS 资源 - 但它们是唯一使用该 css 或 js 文件的页面 - 所以我不想在每个页面中包含该 CSS 和 JS 引用。与其修改每个 View 来引用它需要的 CSS/JS,我想我可以在 Controller 中创建一个 bundle 并将其添加到已经注册的 Bundle 中,然后它将包含在 bundle 引用中,但这并不似乎是可能的,或者我只是走错了路。

例如,在我的注册页面控制器中,我想我可以这样写:

Bundle styleBundle = new Bundle("~/bundles/registrationStyleBundle");
styleBundle.Include("~/Content/Themes/Default/registration.css");
BundleTable.Bundles.Add(styleBundle);

然后在我的 /Views/Shared/_Layout.cshtml 中有这个:

@foreach(Bundle b in BundleTable.Bundles)
 {
     if (b is StyleBundle)
     {
            <link href="@BundleTable.Bundles.ResolveBundleUrl(b.Path)" rel="stylesheet" type="text/css" />
     }
     else if (b is ScriptBundle)
     {
            <script src="@BundleTable.Bundles.ResolveBundleUrl(b.Path)" type="text/javascript"></script>
     }
 }

但这不起作用 - 渲染到我的页面的唯一捆绑包最终是我在RegisterBundles(在 /App_Start/BundleConfig.cs 中)中指定的捆绑包

知道如何实现这种“动态”或“运行时”捆绑吗?

编辑:按照 Jasen 的建议,我最终将包创建/注册代码从控制器中取出,并将其添加到 /App_Start/BundleConfig.cs 中的 RegisterBundles() 中。这样,捆绑包已经可用并且内容被缩小了。所以:

bundles.Add(
new StyleBundle("~/bundles/registrationStyleBundle")
.Include("~/Content/Themes/default/registration.css"));

然后,在我看来,我添加了这个:

@section viewStyles{
    <link href="@BundleTable.Bundles.ResolveBundleUrl("~/bundles/registrationStyleBundle")." rel="stylesheet" type="text/css" />
}

然后,在 /Views/Shared/_Layout.cshtml 中,我添加了这个:

@RenderSection("viewStyles", required: false)
4

1 回答 1

6

使用该@section Scripts { }块有条件地添加捆绑包。

_Layout.cshtml

<body>
    ...
@RenderSection("Scripts", required: false)
</body>

FooView.cshtml

@section Scripts {
    @Scripts.Render("~/bundles/foo")
}

KungFooView.cshtml

@section Scripts {
    @Scripts.Render("~/bundles/kungfoo")
}

在我的 BundleConfig 我通常对资源进行分组

bundles.Add(new ScriptBundle("~/bundles/Areas/Admin/js").Include(...);
bundles.Add(new StyleBundle("~/bundles/Areas/Admin/css").Include(...);
bundles.Add(new ScriptBundle("~/bundles/Areas/Home/js").Include(...);
bundles.Add(new StyleBundle("~/bundles/Areas/Home/css").Include(...);

现在我既可以定义多个布局文件,也可以选择性地将包添加到视图中。

于 2013-05-01T19:39:10.360 回答