2009-05-20 37 views
8

我已经使用了ASP.NET MVC六个月左右,并且已经检查出这些微软家伙创建的Nerd Dinner示例。我注意到他们在启用AJAX到RSVP进行晚餐时所做的一件事就是将用户控件中的JavaScript引用用于RSVPing。
(FILE:RSVPStatus.ascx)链接用户控件中的JavaScript库

<%@ 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>  

这似乎不是我的权利,因为有我会使用这些相同的库在其他地方,比如登录验证一个非常好的机会。另外,如果我更改脚本版本,我需要搜索所有对库的引用。

所以我问,如果我的想法是正确的,这些引用实际上应该在更主要的位置,如主页面?

请让我知道最好的做法是什么这个和专业人士的利弊,如果有的话。

+1

我把它们放在那里,因为我是只使用部分一次。如果我使用了两次,我会把它移开。如果我没有多次使用它,则不需要构建多次使用。 – 2009-05-26 22:05:31

+1

@Scott,你将他们移动到哪里?我想这确实是个问题。如果你在所有的视图页面上都不需要它们,那么将它们包含在母版页上看起来很浪费。 – 2010-08-22 20:13:05

回答

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> 

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> 

HTHS, 查尔斯

诗篇。我同意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); 
} 

然后当奇迹发生......

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

在我的网站www.trailbehind.com上,我们有一组属于所有页面的JavaScript文件。然后一些页面包含额外的库。

对于所有页面使用的JS文件(有几十个文件),我们连接它们并在构建时缩小它们。

在我们的设置文件中有一个标志,表示是否使用串联的JavaScript或构建中的单独文件。这很关键,以便您可以在dev上调试javascript,但在生产中使用小的单一文件JavaScript。

这里是我们的Python代码合并和缩小:

 
import os 
import thetrailbehind.lib.jsmin as jsmin 

JS_FILES = [ 'lib/json2.js', 
       'lib/markermanager.js', 
       'lib/labeledmarker.js', 
       'lib/rsh/rsh.js', 
       'lib/showdown.js', 
       'lib/yui.js', 
       'lib/dragzoom.js', 
       'gen/attribute_data.js', 
       'gen/national-parks.js', 
       'Widgets/CommentsWidget.js', 
       'Widgets/Search.js', 
       'Widgets/MenuWidget.js', 
       'Widgets/PhotoWidget.js', 
       'Widgets/ReportList.js', 
       'Widgets/help.js', 
       'attributes.js', 
       'rsh.js', 
       'map.js', 
       'mapcontrols.js', 
       'markers.js', 
       'amazon.js', 
       'plan_trip.js', 
       'init.js',] 


def concat(files, base_path, all_file, all_file_min): 
    if os.path.exists(base_path + all_file): 
    lasttime = os.path.getmtime(base_path + all_file) 
    else: 
    lasttime = 0 
    out_of_date = False 
    for file in files: 
    if os.path.getmtime(base_path + file) > lasttime: 
     out_of_date = True 
     break 
    if out_of_date: 
    outfile = open(base_path + all_file, 'w') 
    for file in files: 
     outfile.write(open(base_path + file).read()) 
     outfile.write("\n") 
    outfile.close() 

    alljs = open(base_path + all_file) 
    allminjs = open(base_path + all_file_min, "w+") 
    jsmin.JavascriptMinify().minify(alljs, allminjs) 
    alljs.close() 
    allminjs.close() 



def main(): 
    concat(JS_FILES, '/home/wibge/thetrailbehind/media/javascript/', 'gen/all.js', 'gen/all.min.js') 


if __name__ == "__main__": 
    main() 

而且这里是我们切换Django的/ HTML模板:

 
{% if use_all_js %} 
    script type=text/javascript src=/site_media/javascript/gen/all.min.js> 
{% else %} 
    script type="text/javascript" src="/site_media/javascript/rsh.js"> 
    script type="text/javascript" src="/site_media/javascript/amazon.js"> 
    script type="text/javascript" src="/site_media/javascript/map.js"> 
    A BUNCH OF SEPARATE INCLUDES...etc 
{% endif %}