4

私のサイトには、特定の 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)
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 に答える