剃刀视图 - 与部分的麻烦

时间:2011-01-25 01:46:40

标签: asp.net razor webmatrix

我刚收到一些我不希望看到的错误......

要清楚,我将显示错误的工作代码和代码:

这是有效的

_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

问题是:我怎样才能让它发挥作用? 任何建议都很有价值!

2 个答案:

答案 0 :(得分:2)

问题是你仍然在你的子视图中声明该部分,并且剃刀渲染引擎不知道如何处理它。

我不确定处理它的最佳方法是一些可能的解决方法:

  • RenderSection("left", false)移到if区块的正文之外。
  • 在控制器中处理您的安全性,如果用户不应该看到任何内容,则完全显示不同的视图(这可能更可取

答案 1 :(得分:1)

不幸的是,这个“问题”仍然存在于Razor( WebPages实际上)。我见过的一个常见解决方案(并在需要时实现)是静默地将节内容丢弃为空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(),但内容暂时缓冲在内存中

这是一个黑客攻击,但它有效;我试图隐藏它作为渲染过程的一部分。