My use case is I have the MainLayout.razor with this code
@inherits LayoutComponentBase
<header><nav ....></header>
<section><h1>Page Title</h1><section>
<main class="container">
<div class="row"><div class="col-12">@Body</div></div>
</main>
Now I want to set the page title from every @Body razor fragment (maybe by inheritance)
@page "/about"
<div>....</div>
@code {
Title = "About Title";
}
I want avoid to put <section>
inside the @body fragment.
Also have the same problem with the title-element from head-element. What is best practices to do this (without js interop)?
There are a couple of ways to do that...
Using CascadingValue feature Define a property in MainLayout to get the title from child components such as the about component.
Add a CascadingValue component to MainLayout, and pass the MainLayout component as the value of the Value attribute.
In the child component define a CascadingParameter property which stores the MainLayout object, and assign a title to its Title property
Here's the full code:
<div class="main">
<div class="top-row px-4 auth">
<h1>@Title</h1>
<LoginDisplay />
<a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
</div>
<div class="content px-4">
<CascadingValue Value="this">
@Body
</CascadingValue>
</div>
</div>
@code
{
string title;
public string Title
{
get => title;
set
{
if(title != value)
{
title = value;
StateHasChanged();
}
}
}
}
@page "/about"
<div>....</div>
@code {
[CascadingParameter]
public MainLayout MainLayout { get; set; }
protected override void OnInitialized()
{
MainLayout.Title = "About Title";
}
}
Hope this helps...