Dela via


ASP.NET Core-avsnitt Blazor

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Den här artikeln beskriver hur du styr innehållet i en Razor komponent från en underordnad Razor komponent.

Blazor sektioner

Om du vill styra innehållet i en Razor komponent från en underordnad Razor komponent, stöder Blazoravsnitt med hjälp av följande inbyggda komponenter:

Avsnitt kan användas i både layouter och över kapslade föräldra-barnkomponenter.

Även om argumentet som skickas till SectionName kan använda alla typer av höljen, antar dokumentationen kebabhölje (till exempel top-bar), vilket är ett vanligt val för HTML-element-ID:er. SectionId tar emot ett statiskt object fält och vi rekommenderar alltid Pascal-hölje för C#-fältnamn (till exempel TopbarSection).

I följande exempel implementerar huvudlayoutkomponenten i appen en inkrementräknarknapp för appens Counter-komponent.

Om namnområdet för avsnitt inte finns i _Imports.razor filen lägger du till det:

@using Microsoft.AspNetCore.Components.Sections

I komponenten MainLayout (MainLayout.razor) placerar du en SectionOutlet komponent och skickar en sträng till parametern SectionName för att ange avsnittets namn. I följande exempel används avsnittsnamnet top-bar:

<SectionOutlet SectionName="top-bar" />

I komponenten Counter (Counter.razor) skapar du en SectionContent komponent och skickar den matchande strängen (top-bar) till dess SectionName parameter:

<SectionContent SectionName="top-bar">
    <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</SectionContent>

När komponenten Counter används på /counteråterger komponenten MainLayout knappen för inkrementsantal från Counter komponenten där komponenten SectionOutlet placeras. När någon annan komponent används visas inte inkrementräknarknappen.

I stället för att använda ett namngivet avsnitt kan du skicka en statisk object med parametern SectionId för att identifiera avsnittet. I följande exempel implementeras också en inkrementknapp för appens Counter-komponent i huvudlayouten för appen.

Om du inte vill att andra SectionContent komponenter av misstag ska matcha namnet på en SectionOutletskickar du en objektparameter SectionId för att identifiera avsnittet. Detta kan vara användbart när du utformar ett Razor klassbibliotek (RCL). När en SectionOutlet i RCL använder en objektreferens med SectionId och konsumenten placerar en SectionContent komponent med ett matchande SectionId objekt, är en oavsiktlig matchning efter namn inte möjlig när användare av RCL implementerar andra SectionContent komponenter.

I följande exempel implementeras också en inkrementsräknare för appens Counter komponent i appens huvudlayout, med hjälp av en objektreferens i stället för ett avsnittsnamn.

Lägg till en TopbarSection statisk object i komponenten MainLayout i ett @code block:

@code {
    internal static object TopbarSection = new();
}

I komponentens MainLayoutRazor markup placerar du en SectionOutlet komponent och skicka TopbarSection till parametern SectionId för att ange avsnittet.

<SectionOutlet SectionId="TopbarSection" />

Lägg till en SectionContent komponent i appens Counter komponent som renderar en inkrementsräkningsknapp. Använd komponentens MainLayoutTopbarSection avsnitt statisk object som SectionId (MainLayout.TopbarSection).

I Counter.razor:

<SectionContent SectionId="MainLayout.TopbarSection">
    <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</SectionContent>

När komponenten Counter används återger komponenten MainLayout knappen för antal inkrement där komponenten SectionOutlet placeras.

Anmärkning

SectionOutlet och SectionContent komponenter kan bara ange antingen SectionId eller SectionName, inte båda.

RenderFragment cachelagringsregler och avsnittsrenderingsbeteende

När innehållet SectionContentRenderFragment ändras, vilket är en annan instans än komponenten där det återges, Blazor förstör och återskapar avsnittet helt i stället för att försöka uppdatera avsnittets innehåll. Till skillnad från normal rendering kan avsnittets innehåll komma från olika instanser och det är inte meningsfullt att försöka bearbeta innehåll från två separata komponenter, vilket kan leda till oväntade resultat. En detaljerad förklaring av det här beteendet finns i Inkonsekvent komponentinitiering med Blazor SectionOutlet/SectionContent och CascadingValue (dotnet/aspnetcore #58316).

Avsnittsinteraktion med andra Blazor funktioner

Ett avsnitt interagerar med andra Blazor funktioner på följande sätt: