2008-11-26 46 views

回答

10

默认主页面模板包含头部的Content PlaceHolder。如果没有,你可以轻松地添加一个:

<head runat="server"> 
    <title></title> 
    <asp:ContentPlaceHolder ID="head" runat="server" /> 
</head> 

你的意见,可以然后把他们的头想要的东西:

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
    <script src="Scripts/myScripts.js" type="text/javascript"></script> 
    <link href="Styles/myStyles.css" rel="stylesheet" type="text/css" /> 
</asp:Content> 
+0

是不是关于ASP.NET MVC而不是Web表单的问题? – 2014-02-23 02:28:42

+0

Razor视图引擎随MVC 3发布。这是*版本3 *,因为在Razor开发/包含之前,该产品的两个完整版本都已发布。在Razor之前,默认视图引擎是ASPX。 – sliderhouserules 2014-02-24 16:56:02

0

从技术上讲,您应该将所有js放在页面底部以获得最佳性能。

我认为唯一可以做到这一点的方法是将JavaScript包含在VIewData中,并在主页上显示ViewData(不是一个很好的解决方案)。

5

它看起来并不像有一个简单的选择“内置在'到ASP.NET MVC框架中。如果您正在使用用户控件(.ascx),如果您要创建自包含控件,并且该控件也希望管理自己的JavaScript要求,那么您甚至无法使用占位符来帮助您。

在我创建了一个辅助类的结束,它有两个方法:

private static SortedList<int, string> GetRegisteredScriptIncludes() 
{ 
    var registeredScriptIncludes = System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] as SortedList<int, string>; 

    if (registeredScriptIncludes == null) 
    { 
     registeredScriptIncludes = new SortedList<int, string>(); 
     System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] = registeredScriptIncludes; 
    } 

    return registeredScriptIncludes; 
} 

public static void RegisterScriptInclude(this HtmlHelper htmlhelper, string script) 
{ 
    var registeredScriptIncludes = GetRegisteredScriptIncludes(); 
    if (!registeredScriptIncludes.ContainsValue(script)) 
    { 
     registeredScriptIncludes.Add(registeredScriptIncludes.Count, script); 
    } 
} 

public static string RenderScripts(this HtmlHelper htmlhelper) 
{ 
    var registeredScriptIncludes = GetRegisteredScriptIncludes(); 
    var scripts = new StringBuilder(); 
    foreach (string script in registeredScriptIncludes.Values) 
    { 
     scripts.AppendLine("<script src='" + script + "' type='text/javascript'></script>"); 
    } 
    return scripts.ToString(); 
} 

这是它的一个基本形式无论如何,试图证明它的工作方式。它可以在很多方面得到增强,但目前它只是为您滤除重复的脚本插入请求。每当你想在ASCX(或ASPX对这个问题)增加一个新的脚本,你可以这样来做:

<% 
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js")); 
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js")); 
%> 

然后,你需要记住输出他们一旦你完成。这是通过在你的页面的地方,你要输出的脚本标签下面的调用来实现的:

<%=Html.RenderScripts() %> 

似乎至今对我的工作。我确实有一半希望渲染问题取决于RenderScripts被调用的位置,尤其是如果不是所有的RegisterScriptIncludes都被调用过,但目前为止它似乎完成了这项工作。如果你最后渲染脚本,那么你应该没有问题。

4

@Jason:警告,你不应该使用像这样的静态变量...在web上下文中,所有用户和所有页面请求共享静态变量。我很惊讶你的代码没有遇到麻烦。原则是好的,但代码是错误的,会给你带来麻烦。在这种情况下,你应该使用System.Web.HttpContext.Current.Items。有关更多信息,请参见http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx

0

马修,

我看了看在Html.Css和Html.Script助手您的博客。我并不是说要批评,但是我没有在博客中看到关于Css和Script助手如何解决这里讨论的问题的任何提示。这里的问题是需要在渲染过程中的任何时刻“注册”脚本引用,并且可能需要多次(在多次使用模板或局部视图并注册自己的脚本的情况下),然后输出汇总的结果,无重复,在一个位置。

如果您的解决方案解决了这个问题,请纠正我一些问题。

--Regards, 肯