2008-11-26 51 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, 肯