9

部分ビューと MVC に関する 1 つの問題は、再利用可能な部分ビューに特定の JavaScript が必要な場合、それを含めてページの下部のスクリプト セクションにロードする方法がなかったことです。パフォーマンスの問題だけでなく、jquery のような必要なものがまだ存在せず、jquery に依存するコードのファンキーな遅延実行を使用する必要があることを意味します。

この問題の解決策は、パーシャルがレイアウトの正しい場所に表示されるようにスクリプトを登録できるように、パーシャルのセクションを許可することです。

おそらく、MVC4 の最適化/バンドル機能がこの問題を解決するはずです。ただし、@Scripts.Render をパーシャルで呼び出すと、パーシャルがどこにあってもそれらが含まれます。ページの最後にスクリプトを配置することは、魔法のようなことではありません。

Erik Porter のコメントを参照して ください。

MVC 4がこの問題を解決すると言っている他のいくつかの場所を見てきましたが、その方法に関する例はありません。

問題を解決するために MVC4 最適化を使用して、他のスクリプトの後に、部分的に必要なスクリプトを本文の最後に含めるにはどうすればよいですか?

4

1 に答える 1

3

できることの 1 つは、次のような HtmlHelper 拡張メソッドを作成することです。

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;

public static class ScriptBundleManager
{
    private const string Key = "__ScriptBundleManager__";

    /// <summary>
    /// Call this method from your partials and register your script bundle.
    /// </summary>
    public static void Register(this HtmlHelper htmlHelper, string scriptBundleName)
    {
        //using a HashSet to avoid duplicate scripts.
        HashSet<string> set = htmlHelper.ViewContext.HttpContext.Items[Key] as HashSet<string>;
        if (set == null)
        {
            set = new HashSet<string>();
            htmlHelper.ViewContext.HttpContext.Items[Key] = set;
        }

        if (!set.Contains(scriptBundleName))
            set.Add(scriptBundleName);
    }

    /// <summary>
    /// In the bottom of your HTML document, most likely in the Layout file call this method.
    /// </summary>
    public static IHtmlString RenderScripts(this HtmlHelper htmlHelper)
    {
        HashSet<string> set = htmlHelper.ViewContext.HttpContext.Items[Key] as HashSet<string>;
        if (set != null)
            return Scripts.Render(set.ToArray());
        return MvcHtmlString.Empty;
    }
}

パーシャルから、次のように使用します。

@{Html.Register("~/bundles/script1.js");}

そしてあなたのレイアウトファイルで:

   ...
   @Html.RenderScripts()
</body>

パーシャルはレイアウト ファイルの終了前に実行されるため、すべてのスクリプト バンドルが登録され、安全にレンダリングされます。

于 2013-04-23T02:59:51.577 に答える