我刚收到一些我不希望看到的错误......
要清楚,我将显示错误的工作代码和代码:
_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
问题是:我怎样才能让它发挥作用? 任何建议都很有价值!
答案 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()
,但内容暂时缓冲在内存中)
这是一个黑客攻击,但它有效;我试图隐藏它作为渲染过程的一部分。