2011-02-11 152 views
3

在我的MVC 2網站中,我有一個html助手,用於爲我的頁面添加javascript。在我的母版頁中,我有要包含的主要JavaScript,然後在aspx頁面中包含頁面特定的JavaScript。將MVC2 Helpers移動到MVC3剃鬚刀視圖引擎

因此,例如,我的Site.Master有這樣的事情:

.... 
<head> 
    <%=html.renderScripts() %> 
</head> 
... 
//core scripts for main page 
<%html.AddScript("/scripts/jquery.js") %> 
<%html.AddScript("/scripts/myLib.js") %> 
.... 

然後在孩子aspx頁面,我可能還需要包括其他的腳本。

... 
//the page specific script I want to use 
<% html.AddScript("/scripts/register.aspx.js") %> 
... 

所以當整個頁面獲取呈現的JavaScript文件全部收集和SITEMASTER佔位功能RenderScripts的頭部呈現。這工作正常。

現在MVC 3和剃刀視圖引擎,他們的佈局頁面行爲不同,因爲現在我的頁面級別的JavaScripts不呈現/包含。現在我看到了LayoutMaster的內容。

如何獲得MVC 3和剃鬚刀視圖引擎的解決方案? (助手已經被重新寫入到返回HTMLString ;-))

供參考:我MasterLayout看起來是這樣的:

... 
    ... 
    <head> 
    @{ 
     Html.AddJavaScript("/Scripts/jQuery.js"); 
     Html.AddJavaScript("/Scripts/myLib.js"); 
    } 
    //Render scripts 
    @html.RenderScripts() 
    </head> 
.... 

和子頁面看起來是這樣的:

@{ 
    Layout = "~/Views/Shared/MasterLayout.cshtml"; 
    ViewBag.Title = "Child Page"; 
    Html.AddJavaScript("/Scripts/register.aspx.js"); 
} 
.... 
<div>some html </div> 

感謝您的幫助。

編輯=只是爲了解釋,如果這個問題不夠清楚。 (1)通過使用html.addJavascript(「filename.js」)並將它們存儲在字典中 - (1)阻止人們添加重複的js,從而產生設計者想要使用的所有javascript文件文件 - 最後當頁面準備好渲染時,我會將所有JavaScript文件整齊地寫入標題中。 (2) - 這個幫助程序有助於將JS保存在一個地方,並防止設計者在整個地方添加JavaScript文件。這用於mvc 2中Master/SiteMaster Pages的正常工作,但我怎樣才能用剃刀實現呢?

編輯:HTML輔助代碼:

.... 
private const string SCRIPTLINK = 
     "<script src=\"{0}\" type=\"text/javascript\"></script>"; 

public static HtmlString RenderScripts(this HtmlHelper helper) { 

    OrderedDictionary scripts = 
     helper.ViewContext.HttpContext.Items["JavaScripts"] as OrderedDictionary; 

    StringBuilder sb = new StringBuilder(500); 
    foreach (DictionaryEntry script in scripts) { 
       sb.AppendFormat(SCRIPTLINK, script.Key); 
     } 
    return new HtmlString(sb.ToString()); 
} 
.... 
+0

你在哪裏編寫腳本? – SLaks 2011-02-11 15:08:36

+0

什麼是您的HtmlHelper代碼? – 2011-02-11 15:29:33

+0

你在哪裏保存字典? – SLaks 2011-02-11 15:29:43

回答

1

感謝您的幫助和提示Slaks和David。我終於得到了一個似乎可行的解決方案,但有些事情我不喜歡。如果有更好的方法,請隨時指出。

這裏是我的子頁面:

@{ 
    ViewBag.Title = "Child Page"; 
} 

@section Scripts { 

    @{Html.AddJavaScript("/Scripts/register.aspx.js");} 

    } 

<div>some html </div> 

然後我有一個_ViewStart.cshtml有:

@{ 
    this.Context.Items.Add("JavaScripts", 
     new System.Collections.Specialized.OrderedDictionary()); 

    Layout = "~/Views/Shared/MasterLayout.cshtml"; 
} 

而且我MasterLayout看起來是這樣的:

<html> 
    .... 
    <title>@ViewBag.Title</title> 
    <head> 
     @{ 
      //core scripts 
      html.AddScript("/scripts/jquery.js"); 
      html.AddScript("/scripts/myLib.js"); 
      .... 
      } 

      @RenderSection("Scripts", required:true) 

      //Have to call render scripts here, but not sure about this? 
      @Html.RenderScripts() 
    </head> 
.... 
</html> 

這並呈現我的腳本以正確的順序和位置標記,但確實需要客戶端調用html助手renderScript s在子頁面中。這是可以的,因爲我們可以創建模板來幫助解決這個問題。任何更好的想法?

3

這很難幫助您當前的解決方案沒有看到代碼,您HtmlHelpers。然而,另一種(而且很常見的)方法是使用剃刀部分。

在你的頁面佈局定義使用@RenderSection()

<head> 
    <title>Page Title</title> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> 
    @RenderSection("Scripts", required: false) 
</head> 

然後在您的視圖定義部分內容

@section Scripts { 
    <script src="myscript.js" type="text/javascript"></script> 
} 

如果你想保存自己一些打字,使它更清潔的一段placholder,你可以創建一個HtmlHelper來輸出你的腳本標籤

public static MVcHtmlString AddScript(this HtmlHelper helper, string path) { 
    //create script element html here 
} 

,然後你能給我們一個類似的語法風格,你的榜樣

@section Scripts { 
    @Html.AddScript("myscript.js") 
} 
2

您的代碼可能使用不同的字典對於佈局頁面和視圖。

嘗試將該字典存儲在ViewBagHttpContext.Items中。