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.