28

我浏览了 Google 和 Stackoverflow 并没有找到答案。是否有任何内置方法可以使包以延迟的方式执行,或者是否有人知道有人为此编写的扩展帮助器方法?

4

4 回答 4

53

尝试在Codeplex 站点上或通过Nuget 包将 Web 优化升级到 1.1.0 版

在 1.1.0 版中,它们包括Element Template Strings。因此,如果您希望脚本标签包含 defer 属性,您可以轻松地做到这一点:

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

并且将生成以下标记:

<script src="/Scripts/jquery-1.7.1.js" defer></script> 
于 2013-08-01T18:40:13.253 回答
18

上面的答案很棒。我只想快速将我的代码粘贴到这里,供那些想要更简洁语法的人使用。

添加一个新的 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") %>
于 2014-06-16T20:08:29.207 回答
4

您可以使用BundleTable.Bundles.ResolveBundleUrl

<script src="@(BundleTable.Bundles.ResolveBundleUrl("~/bundles/jquery"))" defer></script>
于 2017-04-05T15:06:02.587 回答
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>

现在,最初的问题是,可以在有或没有数据属性的情况下添加deferasync 。

Scripts.Renderscripts.RenderFormat都被引用到System.Web.Optimization,并且应该已经在 MVC 项目中可用。

于 2020-09-16T09:48:55.120 回答