我的网站上有一些页面使用某些 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)