Come eseguire il rendering di una sezione in una vista parziale in MVC3?

In un progetto MVC3, ho un file “_Layout.vbhtml” con questo codice

     ...  @RenderSection("Scripts", false)   

Quindi, ho una vista parziale “ValidationScripts.vbhtml” nella cartella condivisa con

 @Section Scripts     End Section 

Se chiamo la vista parziale da una vista come questa …

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

Just a Test

...

la sezione “Script” non viene visualizzata sulla pagina e l’HTML di output è

      ...    

Come posso rendere la sezione nella vista parziale?

Ho avuto lo stesso problema in aggiunta agli script duplicati, quindi ho creato un paio di metodi di estensione:

 public static class HtmlHelperExtensions { private const string _jSViewDataName = "RenderJavaScript"; private const string _styleViewDataName = "RenderStyle"; public static void AddJavaScript(this HtmlHelper htmlHelper, string scriptURL) { List scriptList = htmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._jSViewDataName] as List; if (scriptList != null) { if (!scriptList.Contains(scriptURL)) { scriptList.Add(scriptURL); } } else { scriptList = new List(); scriptList.Add(scriptURL); htmlHelper.ViewContext.HttpContext .Items.Add(HtmlHelperExtensions._jSViewDataName, scriptList); } } public static MvcHtmlString RenderJavaScripts(this HtmlHelper HtmlHelper) { StringBuilder result = new StringBuilder(); List scriptList = HtmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._jSViewDataName] as List; if (scriptList != null) { foreach (string script in scriptList) { result.AppendLine(string.Format( "", script)); } } return MvcHtmlString.Create(result.ToString()); } public static void AddStyle(this HtmlHelper htmlHelper, string styleURL) { List styleList = htmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._styleViewDataName] as List; if (styleList != null) { if (!styleList.Contains(styleURL)) { styleList.Add(styleURL); } } else { styleList = new List(); styleList.Add(styleURL); htmlHelper.ViewContext.HttpContext .Items.Add(HtmlHelperExtensions._styleViewDataName, styleList); } } public static MvcHtmlString RenderStyles(this HtmlHelper htmlHelper) { StringBuilder result = new StringBuilder(); List styleList = htmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._styleViewDataName] as List; if (styleList != null) { foreach (string script in styleList) { result.AppendLine(string.Format( "", script)); } } return MvcHtmlString.Create(result.ToString()); } } 

Su qualsiasi vista o vista parziale o visualizzazione / modifica del modello, aggiungi semplicemente ciò di cui hai bisogno:

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

Nei tuoi layout lo rendi dove lo vuoi:

 < !DOCTYPE html>   @Html.RenderStyles() @Html.RenderJavascripts() 

L’unico problema che si può avere è l’ordine in cui gli script vengono visualizzati se si arriva a complessi. Se questo diventa un problema, è sufficiente aggiungere gli script nella parte inferiore delle viste / modelli e semplicemente invertire l’ordine nel metodo di estensione prima di renderli.

Non è ansible utilizzare le sezioni nelle viste parziali. Puoi andare per aiutanti personalizzati come menzionato qui .

Penso che dovresti usare gli helper per questo http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

Se è ansible eseguire l’aggiornamento a MVC4, è ansible utilizzare la nuova funzione di raggruppamento e di minimizzazione: http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification . È progettato specificamente per indirizzare ciò che stai cercando di ottenere (compresi gli script).

In alternativa è ansible utilizzare http://combres.codeplex.com/ con MVC3

Se capisco correttamente, hai una struttura

  • Layout.cshtml
  • Visualizza – X
    • PartialView Y (chiamato all’interno di View-X)

quindi è necessario definire il

@section Script{ .... } in View-X e NOT PartialView Y poiché View-X ha la sua View.Layout impostato su Layout.cshtml

tutto questo era una grande informazione, tuttavia se si guarda il suo codice originale, Sezione è maiuscola, quindi non viene riconosciuta.

dovrebbe essere @section blahblah non @Section