如何使用Scripts.Render的ASP MVC 4 Bundles的脚本defer属性

时间:2013-05-29 21:40:39

标签: javascript asp.net asp.net-mvc performance asp.net-mvc-4

我查看了Google和Stackoverflow,但没有找到答案。有没有内置的方法可以使bundle执行为deffered,或者是否有人知道有人编写的扩展帮助器方法?

4 个答案:

答案 0 :(得分:40)

尝试将Web Optimization升级到1.1.0版 Codeplex Site或通过Nuget Package

在1.1.0版中,它们包含元素模板字符串。 因此,如果您希望脚本标记包含defer属性,则可以轻松执行此操作:

@Scripts.RenderFormat("<script src='{0}' defer></script>","~/bundles/jquery")

将生成以下标记:

<script src="/Scripts/jquery-1.7.1.js" defer></script> 

答案 1 :(得分:16)

answer above很棒。我只想在这里快速粘贴我的代码,以便那些想要更简洁的语法。

添加新的C#类

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="Scripts7.cs" company="Believe">
//   http://believeblog.azurewebsites.net/
// </copyright>
// --------------------------------------------------------------------------------------------------------------------

using System.Web;
using System.Web.Optimization;

namespace MVCExtension
{
    /// <summary>
    ///     The scripts.
    /// </summary>
    public static class Scripts
    {
        /// <summary>
        /// Render scripts as deferred
        /// </summary>
        /// <param name="paths">
        /// The paths.
        /// </param>
        /// <returns>
        /// The <see cref="IHtmlString"/>.
        /// </returns>
        public static IHtmlString RenderDefer(params string[] paths)
        {
            return Scripts.RenderFormat(@"<script src='{0}' defer></script>", paths);
        }
    }
}

然后,使用Razor语法:

@Scripts.RenderDefer("~/bundles/jquery")

或Webform语法:

<%: Scripts.RenderDefer("~/bundles/jquery") %>

答案 2 :(得分:3)

您可以使用BundleTable.Bundles.ResolveBundleUrl

<script src="@(BundleTable.Bundles.ResolveBundleUrl("~/bundles/jquery"))" defer></script>

答案 3 :(得分:0)

最新答案,但我想补充一下,因为我遇到了几乎类似的问题,我需要向捆绑的脚本中添加数据属性(与GDPR Cookie解决方案有关)。

解决方案CookieBot在自动模式下阻止了一些脚本,因此,我需要以手动模式实施,并将所有脚本标记为CookieBot脚本忽略。

我在BungleConfig.cs中的脚本如下:

              bundles.Add(new StyleBundle("~/Bundles/late").Include(
                  "~/Scripts/jquery.pep.js",
                  "~/Scripts/jQuery.easing.1.3.js",
                  "~/Content/swiper/js/swiper.js",
                  "~/Scripts/uiActions.js",
                  "~/Scripts/xxm.js",
                  "~/Scripts/addtohomescreen.js",
                  "~/Scripts/d3.min.js"
            ));

然后,在我的_Layout.csthml中。

  @Scripts.RenderFormat("<script data-cookieconsent='ignore' src='{0}' > </script>", "~/Bundles/late")

而且,这就是我渲染后得到的。

<script data-cookieconsent="ignore" src="/nyhed/Bundles/late?v=k3Zae8tC12ZNx0x1iAhyu4U0c8xmGE5TrdLdAqg9C8M1"> </script>

现在是原始问题,可以添加 defer asyn c 以及是否添加数据属性

Scripts.Render scripts.RenderFormat 都引用到 系统。 Web.Optimization ,并且应该已经在MVC项目中可用。