我查看了Google和Stackoverflow,但没有找到答案。有没有内置的方法可以使bundle执行为deffered,或者是否有人知道有人编写的扩展帮助器方法?
答案 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项目中可用。