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

kyl*_*leb 24 javascript asp.net asp.net-mvc performance asp.net-mvc-4

我查看了Google和Stackoverflow,但没有找到答案.是否有任何内置的方法使捆绑执行为deffered或有人知道有人写的扩展帮助方法这样做?

小智 43

尝试在Codeplex站点上或通过Nuget Package将Web Optimization升级到1.1.0版

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

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

并将生成以下标记:

<script src="/Scripts/jquery-1.7.1.js" defer></script> 
Run Code Online (Sandbox Code Playgroud)


Bel*_*014 15

上面答案很棒.我只是想快速粘贴我的代码,以便那些想要更简洁的语法.

添加一个新的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,使用Razor语法:

@Scripts.RenderDefer("~/bundles/jquery")
Run Code Online (Sandbox Code Playgroud)

或Webform语法:

<%: Scripts.RenderDefer("~/bundles/jquery") %>
Run Code Online (Sandbox Code Playgroud)

  • 这与旧版浏览器和XHTML解析器具有更广泛的兼容性.阅读更多:http://www.w3schools.com/tags/att_script_defer.asp (2认同)
  • 我是否缺少某些东西,或者这会引起歧义?Scripts.RenderFormat不会起作用,因为您的类也称为Scripts。虽然很容易解决。 (2认同)