Asp.net mvc MVC4优化如何允许部分视图脚本?

Asp.net mvc MVC4优化如何允许部分视图脚本?,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,部分视图和MVC的一个问题是,如果可重用的部分视图需要某些javascript,则无法将其包含在脚本部分的页面底部并将其加载。除了性能问题之外,这意味着像jquery这样必要的东西还没有出现,您必须对任何依赖jquery的代码使用时髦的延迟执行 这个问题的解决方案是允许部分中的部分,这样部分可以注册它的脚本以显示在布局的正确位置 据推测,MVC4的优化/捆绑功能应该能够解决这个问题。但是,当我在分部中调用@Scripts.Render时,它会在分部所在的任何位置包含它们。将脚本放在页面末尾不会产

部分视图和MVC的一个问题是,如果可重用的部分视图需要某些javascript,则无法将其包含在脚本部分的页面底部并将其加载。除了性能问题之外,这意味着像jquery这样必要的东西还没有出现,您必须对任何依赖jquery的代码使用时髦的延迟执行

这个问题的解决方案是允许部分中的部分,这样部分可以注册它的脚本以显示在布局的正确位置

据推测,MVC4的优化/捆绑功能应该能够解决这个问题。但是,当我在分部中调用@Scripts.Render时,它会在分部所在的任何位置包含它们。将脚本放在页面末尾不会产生任何魔力

请看埃里克·波特的评论:

在其他一些地方,我看到有人说MVC4解决了这个问题,但没有关于如何解决的例子


如何使用MVC4优化来解决问题,在正文的末尾,在其他脚本之后包含分部所需的脚本

您可以做的一件事是创建一些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.RenderScripts()
</body>
。。。
@Html.RenderScripts()

由于您的分区在布局文件结束之前运行,所有脚本包都将被注册并安全呈现。

您的意思是:
{Html.Register(~/bundles/script1.js”);}
实际加载文件名还是
{Html.Register(~/bundles/scriptbundle”);}
要加载BundleConfig.cs中设置的buddle,请按照~/bundles的提示。。。表示法让我知道-感谢书不属于局部视图。对脚本使用父视图。@MatijaGrcic即使将脚本外部化,您仍然面临同样的挑战。我不想用一堆片段引导代码把父视图弄得乱七八糟,然后对每个重用该片段的“父视图”重复这些代码。
   ...
   @Html.RenderScripts()
</body>