用于动态驱动内容的ASP.NET MVC呈现部分(Widgets)

时间:2017-03-09 17:22:22

标签: c# asp.net asp.net-mvc razor

我在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部分已在母版页中定义,为什么它在这里不起作用?。

1 个答案:

答案 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")
}

这只会在该部分存在时呈现该部分。

希望这有帮助。