在用户控件中链接JavaScript库

Bre*_*ski 8 javascript asp.net-mvc

我已经使用ASP.NET MVC大约六个月了,并且已经查看了那些微软人员创建的Nerd Dinner示例.我注意到他们在启用AJAX到RSVP晚餐时所做的一件事就是将用户控件中的JavaScript引用用于RSVP.
(文件:RSVPStatus.ascx)

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<NerdDinner.Models.Dinner>" %>

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>    
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不对,因为我很有可能在其他地方使用这些相同的库,例如登录验证.另外,如果我更改脚本版本,我需要搜索所有对库的引用.

所以我问我的想法是否正确,这些引用实际上应该在主页的中心位置?

请让我知道最佳做法是什么,如果有的话,还有利弊.

Cha*_*ino 7

我肯定会建议不要把它们放在局部内,这正是你提到的原因.一个视图很可能会引入两个部分,这两个部分都引用了相同的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.我同意Andrew的观点,即直接在母版页中定义的任何常见JS应该连接和缩小.

编辑:我按要求实现.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)