www update tools packs net mvc4 mvc language instalar asp asp.net-mvc-3 razor

update - ASP.Net MVC 3 Razor: Sección definida pero no procesada Error



razor mvc (3)

Tengo la siguiente plantilla de diseño:

<div id="columns" class="@View.LayoutClass"> <div id="mainColWrap"> <div id="mainCol"> @RenderBody() </div> </div> @if (View.ShowLeftCol){ <div id="leftCol"> @RenderSection("LeftCol", required: false) </div> } @if (View.ShowRightCol){ <div id="rightCol"> @RenderSection("RightCol", required: false) </div> } </div>

Si View.ShowLeftCol o View.ShowRightCol están configurados en falso, aparece el siguiente error:

Las siguientes secciones se han definido pero no se han procesado para la página de diseño "~ / Views / Shared / _Layout.cshtml": "RightCol".

Estoy tratando de tener una única plantilla de diseño en lugar de tratar de seleccionar dinámicamente una plantilla en tiempo de ejecución. ¿Hay alguna forma de ignorar este error y continuar renderizando? ¿Alguien puede pensar en otra forma de implementar que me permita mostrar / ocultar dinámicamente columnas con Razor?

¡Gracias!


Recibí una sugerencia en los foros de ASP.net que funciona.

Esencialmente, si defino @section LeftCol en mi plantilla de vista pero no ejecuto ningún código que llame a RenderSection en mi diseño, recibo el error porque no se llama cuando View.ShowLeftCol es falso. La sugerencia fue agregar un bloque else y esencialmente descartar cualquier contenido que esté en la sección LeftCol.

@if (View.ShowLeftCol) { <div id="leftCol"> @RenderSection("LeftCol", false) </div> } else { WriteTo(new StringWriter(), RenderSection("LeftCol", false)); }

En base a la preocupación planteada sobre la memoria, decidí probar también lo siguiente. De hecho, también funciona.

@if (showLeft) { <section id="leftcol"> <div class="pad"> @RenderSection("LeftColumn", false) </div> </section> } else { WriteTo(TextWriter.Null, RenderSection("LeftColumn", false)); }

Además, en la parte superior de mi página, esta es mi nueva lógica para showLeft / showRight:

bool showLeft = IsSectionDefined("LeftColumn"); bool showRight = IsSectionDefined("RightColumn"); bool? hideLeft = (bool?)ViewBag.HideLeft; bool? hideRight = (bool?)ViewBag.HideRight; if (hideLeft.HasValue && hideLeft.Value == true) { showLeft = false; } if (hideRight.HasValue && hideRight.Value == true) { showRight = false; }

Alguien más dijo que no funcionó para ellos, pero funcionó como un encanto para mí.


@if (View.ShowLeftCol) { <div id="leftCol"> @RenderSection("LeftCol", false) </div> } else{ <!-- @RenderSection("LeftCol", false) --> }

Manera más fácil !!


@using System.Reflection; @{ HashSet<string> renderedSections = typeof(WebPageBase).GetField("_renderedSections", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField).GetValue(this) as HashSet<string>; }

A continuación, agregue a ese hash el nombre de sección que desea pretender que haya renderizado.