4.6 KiB
title | author | description | monikerRange | ms.author | ms.custom | ms.date | uid |
---|---|---|---|---|---|---|---|
ASP.NET Core Blazor sections | guardrex | Learn how to to control the content in a Razor component from a child Razor component. | >= aspnetcore-8.0 | riande | mvc | 04/18/2023 | blazor/components/sections |
ASP.NET Core Blazor sections
To control the content in a Razor component from a child Razor component, Blazor supports sections using the following built-in components:
-
SectionOutlet
: Renders content provided bySectionContent
components with matchingSectionName
orSectionId
arguments. Two or moreSectionOutlet
components can't have the the sameSectionName
orSectionId
. -
SectionContent
: Provides content as a xref:Microsoft.AspNetCore.Components.RenderFragment toSectionOutlet
components with a matchingSectionName
orSectionId
. If severalSectionContent
components have the sameSectionName
orSectionId
, the matchingSectionOutlet
component renders the content of the last renderedSectionContent
.
Sections can be used in both layouts and across nested parent-child components.
Although the argument passed to SectionName
can use any type of casing, the documentation adopts kebab casing (for example, top-bar
), which is a common casing choice for HTML element IDs. SectionId
receives a static object
field, and we always recommend Pascal casing for C# field names (for example, TopbarSection
).
In the following example, the app's main layout component implements an increment counter button for the app's Counter
component.
Add the namespace for sections to the _Imports.razor
file:
@using Microsoft.AspNetCore.Components.Sections
In the MainLayout
component (Shared/MainLayout.razor
), place a SectionOutlet
component and pass a string to the SectionName
parameter to indicate the section's name. The following example uses the section name top-bar
:
<SectionOutlet SectionName="top-bar" />
In the Counter
component (Pages/Counter.razor
), create a SectionContent
component and pass the matching string (top-bar
) to its SectionName
parameter:
<SectionContent SectionName="top-bar">
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</SectionContent>
When the Counter
component is accessed at /counter
, the MainLayout
component renders the increment count button from the Counter
component where the SectionOutlet
component is placed. When any other component is accessed, the increment count button isn't rendered.
Instead of using a named section, you can pass a static object
with the SectionId
parameter to identify the section. The following example also implements an increment counter button for the app's Counter
component in the app's main layout.
If you don't want other SectionContent
components to accidentally match the name of a SectionOutlet
, pass an object SectionId
parameter to identify the section. This can be useful when designing a Razor class library (RCL). When a SectionOutlet
in the RCL uses an object reference with SectionId
and the consumer places a SectionContent
component with a matching SectionId
object, an accidental match by name isn't possible when consumers of the RCL implement other SectionContent
components.
The following example also implements an increment counter button for the app's Counter
component in the app's main layout, using an object reference instead of a section name.
Add a TopbarSection
static object
to the MainLayout
component in an @code
block:
@code {
internal static object TopbarSection = new();
}
In the MainLayout
component's Razor markup, place a SectionOutlet
component and pass TopbarSection
to the SectionId
parameter to indicate the section:
<SectionOutlet SectionId="TopbarSection" />
Add a SectionContent
component to the app's Counter
component that renders an increment count button. Use the MainLayout
component's TopbarSection
section static object
as the SectionId
(MainLayout.TopbarSection
).
In Pages/Counter.razor
:
<SectionContent SectionId="MainLayout.TopbarSection">
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
</SectionContent>
When the Counter
component is accessed, the MainLayout
component renders the increment count button where the SectionOutlet
component is placed.
[!NOTE]
SectionOutlet
andSectionContent
components can only set eitherSectionId
orSectionName
, not both.