23

在MVC3項目,我有一個「_Layout.vbhtml」文件與此代碼如何渲染MVC3中的部分視圖中的部分?

<!DOCTYPE html> 
<html> 
    <head> 
    </head> 
    <body> 
    ... 
    <script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script> 
    @RenderSection("Scripts", false) 
    </body> 
</html> 

然後,我有一個局部視圖「ValidationScripts.vbhtml」中的共享文件夾與

@Section Scripts 
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.fix.js")"></script> 
    <script src="@Url.Content("~/Scripts/localization/messages_de.js")"></script>  
End Section 

如果我把從這樣的視圖局部視圖...

@ModelType MvcExample.MyModel 
@Code 
    ViewData("Title") = "Test" 
End Code 

@Html.Partial("ValidationScripts") 

<h2>Just a Test</h2> 
... 

節「腳本」沒有在網頁上呈現,輸出HTML是

<!DOCTYPE html> 
<html> 
    <head> 
    </head> 
    <body> 
    ... 
    <script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script> 

    </body> 
</html> 

我怎樣才能呈現局部視圖的部分?

回答

45

我對重複腳本的頂部同樣的問題,所以我創建了幾個擴展方法:

public static class HtmlHelperExtensions 
{ 
    private const string _jSViewDataName = "RenderJavaScript"; 
    private const string _styleViewDataName = "RenderStyle"; 

    public static void AddJavaScript(this HtmlHelper htmlHelper, 
            string scriptURL) 
    { 
    List<string> scriptList = htmlHelper.ViewContext.HttpContext 
     .Items[HtmlHelperExtensions._jSViewDataName] as List<string>; 
    if (scriptList != null) 
    { 
     if (!scriptList.Contains(scriptURL)) 
     { 
     scriptList.Add(scriptURL); 
     } 
    } 
    else 
    { 
     scriptList = new List<string>(); 
     scriptList.Add(scriptURL); 
     htmlHelper.ViewContext.HttpContext 
     .Items.Add(HtmlHelperExtensions._jSViewDataName, scriptList); 
    } 
    } 

    public static MvcHtmlString RenderJavaScripts(this HtmlHelper HtmlHelper) 
    { 
    StringBuilder result = new StringBuilder(); 

    List<string> scriptList = HtmlHelper.ViewContext.HttpContext 
     .Items[HtmlHelperExtensions._jSViewDataName] as List<string>; 
    if (scriptList != null) 
    { 
     foreach (string script in scriptList) 
     { 
     result.AppendLine(string.Format(
      "<script type=\"text/javascript\" src=\"{0}\"></script>", 
      script)); 
     } 
    } 

    return MvcHtmlString.Create(result.ToString()); 
    } 

    public static void AddStyle(this HtmlHelper htmlHelper, string styleURL) 
    { 
    List<string> styleList = htmlHelper.ViewContext.HttpContext 
     .Items[HtmlHelperExtensions._styleViewDataName] as List<string>; 

    if (styleList != null) 
    { 
    if (!styleList.Contains(styleURL)) 
    { 
     styleList.Add(styleURL); 
    } 
    } 
    else 
    { 
    styleList = new List<string>(); 
    styleList.Add(styleURL); 
    htmlHelper.ViewContext.HttpContext 
     .Items.Add(HtmlHelperExtensions._styleViewDataName, styleList); 
    } 
} 

public static MvcHtmlString RenderStyles(this HtmlHelper htmlHelper) 
{ 
    StringBuilder result = new StringBuilder(); 

    List<string> styleList = htmlHelper.ViewContext.HttpContext 
    .Items[HtmlHelperExtensions._styleViewDataName] as List<string>; 

    if (styleList != null) 
    { 
    foreach (string script in styleList) 
    { 
     result.AppendLine(string.Format(
     "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />", 
     script)); 
    } 
    } 

    return MvcHtmlString.Create(result.ToString()); 
    } 
} 

在任何視圖或局部視圖或顯示/編輯模板只需添加你需要的東西:

@{ 
    Html.AddJavaScript("http://cdn.jquerytools.org/1.2.7/full/jquery.tools.min.js"); 
} 

在你的佈局你渲染它,你想讓它:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    @Html.RenderStyles() 
    @Html.RenderJavascripts() 

外核層如果您遇到複雜問題,您可能擁有的是腳本的渲染順序。如果這成爲一個問題,只需將腳本添加到視圖/模板的底部,然後在渲染它們之前簡單地顛倒擴展方法中的順序。

+0

精彩的擴展! – Max

+2

任何使用MVC 4(或更高版本)審閱此內容的人,都應該使用[Bundling](http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification)。 –

+0

如果您在佈局文件中調用partial,這將不起作用。當時Html.AddJavaScript已經運行。 – LiverpoolsNumber9

2

,我認爲你應該使用助手這個http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

如果你可以升級到MVC4你可以使用新的捆綁和縮小功能:http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification。它專門設計用於解決您試圖實現的目標(包括腳本)。

另外,您可以使用http://combres.codeplex.com/與MVC3

+0

能否請您詳細闡述瞭如何使用'@ helper'添加腳本? – Shimmy

0

如果我理解正確的話,你有一個結構

  • Layout.cshtml
  • 查看 - X
    • PartialView Y(稱爲查看-X內)

,那麼你需要定義在查看-X

@section Script{ .... }不PartialViewŸ因爲查看-XView.Layout設置爲Layout.cshtml

+0

當然,我可以在任何視圖中手動添加「腳本」部分。但是,如果我想將所有腳本標記分組在一個地方並在視圖中重複使用,我該怎麼做? – Max

+0

如果所有使用該佈局的視圖正在使用腳本,或者您將不得不在佈局中引用佈局,則只需在佈局中呈現該局部!如果你想走這條路,你可以在佈局中嘗試繼承,部分佈局所使用的佈局只是將剩下的東西渲染爲空。那有意義嗎 ? – frictionlesspulley

+0

什麼? :)是的,我可以按照這種方式,但我認爲@埃裏克的擴展方法更有用。 – Max

5

不能在使用部分部分意見。你可以去here提到的定製助手。

+0

有用的鏈接,謝謝。 – Max

0

所有這些都是很好的信息,但是如果你看他的原始代碼,Section是大寫,因此不被識別。

應該@section blahblah不@Section