2017-03-09 4 views
1

Ich erhalte den folgenden Fehler in ASP.NET MVC. "Die folgenden Abschnitte wurden definiert, wurden aber nicht für die Layoutseite gerendert" - Jetzt weiß ich, worum es bei dem Fehler geht, aber ich kann es nicht verstehen. Es sollte funktionieren, aber ich weiß nicht warum Gewohnheit.ASP.NET MVC Rendering-Abschnitte für dynamisch angetriebene Inhalte (Widgets)

Ich habe eine index.cshtml-Seite, die alle dynamisch gesteuerten DB-Inhalt rendert. Seiten können Widgets enthalten (wiederverwendbare Blöcke für Inhalte). Der index.cshtml-Code ist unten:

@{ 
    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; 
     } 

    //} 
} 

Jetzt habe ich ein _DefaultTheme.cshtml mit den folgenden Abschnitten. (Dies ist die primäre Layout-Seite)

<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> 

Hinzufügen von Widgets zu der jeder Seite, die das _DefaultTheme Layout hat perfekt funktioniert gut, aber wenn ich Seiten beginnen zu erben wird es ein Problem. Ich habe jetzt eine andere Seite _DefaultThemeArticles.cshtml die Masterseite ist _DefaultTheme.cshtml

Die _DefaultThemeArticles.cshtml diese enthält:

@{ 
    Layout = "~/Themes/_DefaultTheme.cshtml"; 
} 


<div class="container"> 
    @RenderBody() 
</div> 

nun der Fehler tritt auf, wenn Widgets auf jeder Seite hinzugefügt, die dieses Layout hat. Ich bekomme diesen Fehler:

Die folgenden Abschnitte wurden definiert, wurden aber nicht für die Layoutseite "~/Themes/_DefaultThemeArticles.cshtml" gerendert: "_BelowBodySection".

Aber der Abschnitt _BelowBodySection wurde in der Masterseite definiert, warum würde es hier nicht funktionieren ?.

+1

Es ist nicht so automatisch, wie Sie vielleicht denken. Sie müssen den Abschnitt in der untergeordneten Vorlage definieren, wenn Sie ihn dort verwenden und auf den entsprechenden Abschnitt der übergeordneten Vorlage verweisen möchten. Siehe http://stackoverflow.com/questions/8578843/rendersection-in-nested-razor-templates. – Jasen

Antwort

1

Das Problem ist, dass in Ihrer Layoutseite, _DefaultTheme.cshtml, durch alle diese Schreiben:

@RenderSection("_HeaderSection", false) 
@RenderSection("_AboveBodySection", false) 
@RenderSection("_BelowBodySection", false) 
@RenderSection("_AfterBodySection", false) 
@RenderSection("_FooterSection",false) 

Sie behaupten, dass in jedem Kind Seite, wie _DefaultThemeArticles, muss es einen Abschnitt für jede der definierten sein über. Wenn Razor in der untergeordneten Seite keinen bestimmten definierten Abschnitt (in Ihrem Fall _BelowBodySection) findet, wird der Fehler ausgegeben. Sie können folgende Razor verwenden, um dies zu lösen:

@if (IsSectionDefined("_BelowBodySection")) 
{ 
    @RenderSection("_BelowBodySection") 
} 

Dadurch wird nur der Abschnitt machen, wenn es vorhanden ist.

Hoffe, das hilft.

+0

Ich verstehe das, aber wie auf der Indexseite zu sehen, verwende ich die DefineSection-Methode, um diese dynamisch zu schreiben. Seiten können Widgets enthalten, und diese Widgets enthalten einen Abschnittsnamen. Der Abschnittsname muss existieren und in diesem Fall sind sie im übergeordneten Layout vorhanden. Die DefineSection-Methode sollte diese Abschnitte korrekt wiedergeben? – user7321559