2

予期しないエラーが発生しました...

明確にするために、動作中のコードとエラーのあるコードを示します。

これは機能しています

_MainLayout.cshtml

<div id="content">
    <h1>@Page.Title</h1>
    @RenderSection("left", false)
    @RenderBody()
</div> 

Page.cshtml

@section left{
<p>Some text on left side</p>
}

<div>
    Some content
</div>

この場合、すべてが正常に機能しますが、@RenderSection("left", false)内部を削除_MainLayout.cshtmlすると例外が発生します。どちらの場合に必要ですか?以下の例を参照してください。

これは機能していません

_MainLayout.cshtml

@if (WebSecurity.IsAuthenticated) {
    <h1>@Page.Title</h1>
    @RenderSection("left", false)
    @RenderBody()
} else {
    <h1>You not logged in!</h1>
    <p>To see this page, you have to login first.</p>
}

Page.cshtml

@section left{
<p>Some text on left side</p>
}

<div>
    Some content
</div>

この場合、ユーザーが認証されていない場合、次の例外があります。

説明: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

例外の詳細: System.Web.HttpException: Следующие разделы были определены, но не были обработаны для страницы макета "~/_MainLayout.cshtml": "left". 次のように翻訳できます: Section was created but wasn't rendered for layout page "~/_MainLayout.cshtml": "left".

ソースエラー:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

スタックトレース:

[HttpException (0x80004005): Следующие разделы были определены, но не были обработаны для страницы макета "~/_MainLayout.cshtml": "left".]
   System.Web.WebPages.WebPageBase.VerifyRenderedBodyOrSections() +91298
   System.Web.WebPages.WebPageBase.PopContext() +332
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +95
   System.Web.WebPages.<>c__DisplayClass7.<RenderPageCore>b__6(TextWriter writer) +102
   System.Web.WebPages.HelperResult.WriteTo(TextWriter writer) +12
   System.Web.WebPages.WebPageBase.Write(HelperResult result) +67
   System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body) +66
   System.Web.WebPages.WebPageBase.PopContext() +262
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +95
   System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContext context) +249

問題は、どうすればそれを機能させることができるかということです。どんなアドバイスも貴重です!

4

2 に答える 2

2

問題は、子ビューでセクションをまだ宣言していて、かみそりのレンダリングエンジンがそれをどう処理するかを認識していないことです。

それに対処するための最良の方法がいくつかの可能な回避策であるかどうかはわかりません:

  • ブロックRenderSection("left", false)本体の外側に移動します。if
  • コントローラでセキュリティを処理し、ユーザーに何も表示されない場合は、まったく別のビューを表示します(これはおそらく望ましいことです
于 2011-01-25T02:04:19.263 に答える
1

残念ながら、この「問題」はRazor(実際にはWebPages)でも引き続き発生します。私が見た(そして必要に応じて実装した)一般的な解決策は、セクションの内容をサイレントに破棄してnullにすることTextWriterです:

@if (WebSecurity.IsAuthenticated) {
    <h1>@Page.Title</h1>
    @RenderSection("left", false)
    @RenderBody()
} else {
    <h1>You not logged in!</h1>
    <p>To see this page, you have to login first.</p>
    @{
        WriteTo(TextWriter.Null, RenderSection("left"));
    }
}

の呼び出しは、定義された各セクションRenderSectionに対応するを呼び出すという課せられた要件を満たします。RenderSectionダンプしTextWriter.Nullてコンテンツを破棄し、メモリ消費への影響を最小限に抑えます(他の実装では使用されていますnew StringWriter()が、コンテンツは一時的にメモリにバッファリングされます

これはハックですが、機能します。レンダリングプロセスの一部としてそれを隠そうとしています。

于 2013-03-03T22:21:51.840 に答える