在部分视图中包含JavaScript文件

Pet*_*ter 69 javascript asp.net-mvc jquery partial-views

我想知道在部分视图中包含javascript文件的最佳做法是什么.一旦渲染,这将最终作为我的页面的html中间的js包含标记.从我的角度来看,这不是一个很好的方法.它们属于head标签,因此不应阻止浏览器一次性呈现html.

一个例子: 我在'PictureGallery'局部视图中使用了一个jquery picturegallery插件,因为这个局部视图将在几个页面上使用.这个插件只需要在使用这个视图时加载,我不想知道每个局部视图使用哪些插件......

谢谢你的回答.

Cha*_*ino 28

似乎与此问题非常相似:在用户控件中链接JavaScript库

我会在这里重新提出我的答案.

我肯定会建议不要把它们放在局部内,这正是你提到的原因.一个视图很可能会引入两个部分,这两个部分都引用了相同的js文件.在加载其余的html之前,你还获得了加载js的性能.

我不知道最佳实践,但我选择在母版页中包含任何常见的js文件,然后为某些特定或少量视图的其他js文件定义单独的ContentPlaceHolder.

这是一个示例母版页 - 它非常自我解释.

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<head runat="server">
    ... BLAH ...
    <asp:ContentPlaceHolder ID="AdditionalHead" runat="server" />
    ... BLAH ...
    <%= Html.CSSBlock("/styles/site.css") %>
    <%= Html.CSSBlock("/styles/ie6.css", 6) %>
    <%= Html.CSSBlock("/styles/ie7.css", 7) %>
    <asp:ContentPlaceHolder ID="AdditionalCSS" runat="server" />
</head>
<body>
    ... BLAH ...
    <%= Html.JSBlock("/scripts/jquery-1.3.2.js", "/scripts/jquery-1.3.2.min.js") %>
    <%= Html.JSBlock("/scripts/global.js", "/scripts/global.min.js") %>
    <asp:ContentPlaceHolder ID="AdditionalJS" runat="server" />
</body>
Run Code Online (Sandbox Code Playgroud)

Html.CSSBlock和Html.JSBlock显然是我自己的扩展,但同样,他们在他们的工作中是自我解释的.

然后说一个SignUp.aspx视图我会

<asp:Content ID="signUpContent" ContentPlaceHolderID="AdditionalJS" runat="server">
    <%= Html.JSBlock("/scripts/pages/account.signup.js", "/scripts/pages/account.signup.min.js") %>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)

HTHs,查尔斯

PS.以下是关于缩小和连接js文件的后续问题:动态 连接和缩小JS或构建时 - ASP.NET MVC

编辑:根据我的其他答复的要求,我按要求实施了.JSBlock(a,b)

public static MvcHtmlString JSBlock(this HtmlHelper html, string fileName)
{
    return html.JSBlock(fileName, string.Empty);
}

public static MvcHtmlString JSBlock(this HtmlHelper html, string fileName, string releaseFileName)
{
    if (string.IsNullOrEmpty(fileName))
        throw new ArgumentNullException("fileName");

    string jsTag = string.Format("<script type=\"text/javascript\" src=\"{0}\"></script>",
                                 html.MEDebugReleaseString(fileName, releaseFileName));

    return MvcHtmlString.Create(jsTag);
}
Run Code Online (Sandbox Code Playgroud)

然后魔术发生的地方......

    public static MvcHtmlString MEDebugReleaseString(this HtmlHelper html, string debugString, string releaseString)
    {
        string toReturn = debugString;
#if DEBUG
#else
        if (!string.IsNullOrEmpty(releaseString))
            toReturn = releaseString;
#endif
        return MvcHtmlString.Create(toReturn);
    }
Run Code Online (Sandbox Code Playgroud)