Linking JavaScript Libraries in User Controls

后端 未结 2 553
攒了一身酷
攒了一身酷 2020-12-06 03:06

I have been using ASP.NET MVC for six months or so and have been checking out the Nerd Dinner example created by those Microsoft guys. One thing I noticed they did when ena

2条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-06 03:44

    I would definitely advise against putting them inside partials for exactly the reason you mention. There is a high chance that one view could pull in two partials that both have references to the same js file. You've also got the performance hit of loading js before loading the rest of the html.

    I don't know about best practice but I choose to include any common js files inside the masterpage and then define a separate ContentPlaceHolder for some additional js files that are specific to a particular or small number of views.

    Here's an example master page - it's pretty self explanatory.

    <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
    
        ... BLAH ...
        
        ... BLAH ...
        <%= Html.CSSBlock("/styles/site.css") %>
        <%= Html.CSSBlock("/styles/ie6.css", 6) %>
        <%= Html.CSSBlock("/styles/ie7.css", 7) %>
        
    
    
        ... 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") %>
        
    
    

    Html.CSSBlock & Html.JSBlock are obviously my own extensions but again, they are self explanatory in what they do.

    Then in say a SignUp.aspx view I would have

    
        <%= Html.JSBlock("/scripts/pages/account.signup.js", "/scripts/pages/account.signup.min.js") %>
    
    

    HTHs, Charles

    Ps. I would agree with Andrew in saying that any common JS that is defined directly inside the master page should be concatenated and minified.

    EDIT: My implementation of .JSBlock(a, b) as requested

    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("",
                                     html.MEDebugReleaseString(fileName, releaseFileName));
    
        return MvcHtmlString.Create(jsTag);
    }
    

    And then where the magic happens...

        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);
        }
    

提交回复
热议问题