私のサイトには、特定の CSS および JS リソースを使用するページがいくつかありますが、それらはその css または js ファイルを使用する唯一のページです。そのため、その CSS および JS 参照をすべてのページに含めたくありません。必要な CSS/JS を参照するように各ビューを変更するのではなく、コントローラーでバンドルを作成し、既に登録されているバンドルに追加して、バンドル参照に含めることができると考えましたが、これはそうではありません可能だと思われるか、間違った方法で行っているだけかもしれません。
たとえば、登録ページのコントローラーでは、次のように書けると思いました。
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)