Como renderizar uma seção em uma visão parcial no MVC3?

Em um projeto MVC3, eu tenho um arquivo “_Layout.vbhtml” com este código

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

Então, eu tenho uma visão parcial “ValidationScripts.vbhtml” na pasta compartilhada com

 @Section Scripts     End Section 

Se eu chamar a vista parcial de uma vista como esta …

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

Just a Test

...

a seção “Scripts” não é renderizada na página, e o HTML de saída é

      ...    

Como posso processar a seção na visão parcial?

Eu tive o mesmo problema em cima de scripts duplicados, então criei alguns methods de extensão:

 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()); } } 

Em qualquer Vista ou Vista Parcial ou Display / Edit Template você simplesmente adiciona o que você precisa:

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

Nos seus Layouts, você renderiza onde quiser:

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

O único problema que você pode ter é a ordem em que os scripts são renderizados se você chegar ao complexo. Se isso se tornar um problema, basta adicionar os scripts à parte inferior de suas visualizações / modelos e simplesmente inverter a ordem no método de extensão antes de processá-los.

Você não pode usar seções em vistas parciais. Você pode ir para ajudantes personalizados como mencionado aqui .

Eu acho que você deveria estar usando helpers para este http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

Se você pode atualizar para o MVC4, você pode usar o novo recurso de empacotamento e minificação: http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification . Ele é projetado especificamente para abordar o que você está tentando alcançar (incluindo scripts).

Alternativamente, você poderia usar http://combres.codeplex.com/ com MVC3

Se bem entendi você tem uma estrutura

  • Layout.cshtml
  • Visualizar – X
    • PartialView Y (chamado dentro de View-X)

então você precisa definir o

@section Script{ .... } no View-X e NÃO no PartialView Y, uma vez que o View-X tem o seu View.Layout definido como Layout.cshtml

Tudo isso foi ótimo info, no entanto, se você olhar para o seu código original, a seção é capitalizada, portanto, não sendo reconhecido.

deve ser @section blahblah não @section