ASP.Net MVC 3 Razor: раздел определен, но не отображается ошибка - PullRequest
25 голосов
/ 24 ноября 2010

У меня есть следующий шаблон макета:

<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>

Если View.ShowLeftCol или View.ShowRightCol установлены в false, я получаю следующую ошибку:


Следующие разделыбыли определены, но не были отображены для страницы макета "~ / Views / Shared / _Layout.cshtml": "RightCol".


Я пытаюсь использовать один шаблон макета вместо того, чтобы динамически выбирать шаблон во время выполнения.Есть ли способ игнорировать эту ошибку и продолжить рендеринг?Может кто-нибудь придумать другой способ реализации, который позволил бы мне динамически отображать / скрывать столбцы с помощью Razor?

Спасибо!

Ответы [ 3 ]

31 голосов
/ 24 ноября 2010

На форумах ASP.net было выдвинуто предложение, которое работает.

По сути, если я определяю @section LeftCol в шаблоне моего представления, но не запускаю код, вызывающий RenderSectionв моем макете я получаю сообщение об ошибке, потому что оно не вызывается, когда View.ShowLeftCol имеет значение false.Было предложено добавить блок else и, по существу, выбросить все содержимое в разделе LeftCol.

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

Основываясь на озабоченности по поводу памяти, я решил также протестировать следующее.Действительно, это также работает.

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

Кроме того, в верхней части моей страницы это моя новая логика для 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; }

Кто-то еще сказал, что это не работаетдля них, но для меня это сработало.

2 голосов
/ 26 июня 2011
@using System.Reflection;
@{
    HashSet<string> renderedSections = typeof(WebPageBase).GetField("_renderedSections", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField).GetValue(this) as HashSet<string>;
}

Затем добавьте к этому хешу любое имя раздела, которое вы хотите сделать видным.

0 голосов
/ 02 декабря 2011
@if (View.ShowLeftCol)
{ 
<div id="leftCol"> 
    @RenderSection("LeftCol", false) 
</div> 
}
else{  <!-- @RenderSection("LeftCol", false) -->  }

более простой способ !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...