web-dev-qa-db-ja.com

ASP.Net MVC 3 Razor:セクションが定義されているがレンダリングされていないエラー

次のレイアウトテンプレートがあります。

<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で列を動的に表示/非表示にできる別の実装方法を誰かが考えられますか?

ありがとう!

25
Sam

動作する 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; }

他の誰かがそれは彼らのために働かなかったと言いました、しかしそれは私にとって魅力のように働きました。

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

次に、レンダリングしたふりをしたいセクション名をそのハッシュセットに追加します。

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

より簡単な方法!

0
helloworld