ASP.NET MVC 4 - 从Controller添加Bundle?

jam*_*uss 4 asp.net-mvc-4 bundling-and-minification

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

例如,在我的Controller for a registration页面中,我想我可以这样写:

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

然后在我的/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>
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

bundles.Add(
new StyleBundle("~/bundles/registrationStyleBundle")
.Include("~/Content/Themes/default/registration.css"));
Run Code Online (Sandbox Code Playgroud)

然后,在我看来,我补充说:

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

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

@RenderSection("viewStyles", required: false)
Run Code Online (Sandbox Code Playgroud)

Jas*_*sen 6

使用@section Scripts { }块有条件地添加包.

_Layout.cshtml

<body>
    ...
@RenderSection("Scripts", required: false)
</body>
Run Code Online (Sandbox Code Playgroud)

FooView.cshtml

@section Scripts {
    @Scripts.Render("~/bundles/foo")
}
Run Code Online (Sandbox Code Playgroud)

KungFooView.cshtml

@section Scripts {
    @Scripts.Render("~/bundles/kungfoo")
}
Run Code Online (Sandbox Code Playgroud)

在我的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(...);
Run Code Online (Sandbox Code Playgroud)

现在,我可以定义多个布局文件,也可以选择性地向视图添加包.