我在ASP.NET MVC中收到以下错误。 "以下部分已定义,但尚未针对布局页面进行渲染" - 现在我知道这个错误是什么,但是无法解决这个错误,事实上它可能应该有效,但我不知道它为什么会失败。
我有一个index.cshtml页面,它呈现所有动态驱动的DB内容。页面可以包含小部件(内容上的可重用块)。 index.cshtml代码如下:
@{
Layout = AppSettings.LayoutFileDirectory + "/" + PageDAL.GetLayoutFileForPage(Model.Page);
string currentSection = string.Empty;
}
@if(!string.IsNullOrEmpty(Model.Page.PageTitle))
{
<h3>@Model.Page.PageTitle</h3>
}
@Html.Raw(Model.Page.PageText)
@foreach (var item in Model.Page.WidgetsInPages)
{
//if(IsSectionDefined(item.WidgetSection))
//{
string sectionName = item.WidgetSection;
//don't want to redefine section
if (currentSection!= sectionName)
{
DefineSection(sectionName, () =>
{
//render all this sections widgets
foreach (var insider in Model.Page.WidgetsInPages.Where(w => w.WidgetSection == sectionName).OrderBy(w => w.WidgetSortOrder))
{
if (insider.Widget.WidgetFile != null)
{
Write(Html.Partial(AppSettings.WidgetTemplatesDirectory + "/" + insider.Widget.WidgetFile, item.Widget));
//Write(Html.Partial(AppSettings.WidgetTemplatesDirectory + "/" + insider.Widget.WidgetFile, new {Widget=item.Widget}));
}
}
});
currentSection = sectionName;
}
//}
}
现在我有一个带有以下部分的_DefaultTheme.cshtml。 (这是主要布局页面)
<div class="header">
@RenderSection("_HeaderSection", false)
</div>
<div class="container">
@RenderSection("_AboveBodySection", false)
@RenderBody()
@RenderSection("_BelowBodySection", false)
</div>
@RenderSection("_AfterBodySection", false)
<footer class="footer">
<div class="container">
@RenderSection("_FooterSection",false)
@Html.Raw(FrontEnd.PopulateFooter(Model.Website))
</div>
</footer>
将小部件添加到具有_DefaultTheme布局的任何页面都可以正常工作,但是当我开始继承页面时,它就成了一个问题。我现在有另一页_DefaultThemeArticles.cshtml主页是_DefaultTheme.cshtml
_DefaultThemeArticles.cshtml包含:
@{
Layout = "~/Themes/_DefaultTheme.cshtml";
}
<div class="container">
@RenderBody()
</div>
现在,将窗口小部件添加到具有此布局的任何页面时都会发生错误。我收到这个错误:
以下部分已定义,但尚未针对布局页面进行渲染&#34;〜/ Themes / _DefaultThemeArticles.cshtml&#34;:&#34; _BelowBodySection&#34;。
但是_BelowBodySection部分已在母版页中定义,为什么它在这里不起作用?。
答案 0 :(得分:0)
问题在于,在您的布局页面_DefaultTheme.cshtml
中,写下以下所有内容:
@RenderSection("_HeaderSection", false)
@RenderSection("_AboveBodySection", false)
@RenderSection("_BelowBodySection", false)
@RenderSection("_AfterBodySection", false)
@RenderSection("_FooterSection",false)
您声称在任何子页面中,如_DefaultThemeArticles
,必须为上述每个子页面定义一个部分。如果Razor未在子页面中找到定义的特定部分(在您的情况下为_BelowBodySection
),则会抛出错误。您可以使用以下Razor来解决此问题:
@if (IsSectionDefined("_BelowBodySection"))
{
@RenderSection("_BelowBodySection")
}
这只会在该部分存在时呈现该部分。
希望这有帮助。