Лучшая реализация сервиса с ограниченным доступом:
public class CurrentPage
{
public string CurrentPageName { get; private set; }
public void SetCurrentPageName(string name)
{
if (!string.Equals(CurrentPageName, name))
{
CurrentPageName = name;
NotifyStateChanged();
}
}
public event Action OnChange; // event raised when changed
private void NotifyStateChanged() => OnChange?.Invoke();
}
Мы не передаем словари объектов, у нас есть простой сервис, который выполняет одну задачу. Единственный способ изменить страницу - позвонить по номеру SetCurrentPageName
, который вызывает событие, чтобы потребители знали об измененном имени. Это требуется между не вложенными компонентами, так как в противном случае обновления не распространяются по всему
Нам также необходимо зарегистрировать службу (в том виде, в каком она существует, поскольку текущая страница определяется сессией c) при запуске:
services.AddScoped<CurrentPage>();
Мы добавим Index.razor
и используем это:
@page "/"
@inject CurrentPage currentPage
<h1>Hello, world!</h1>
Welcome to your new app.
<button @onclick="ChangeName">Set Page Name</button>
<SurveyPrompt Title="How is Blazor working for you?" />
@code
{
protected override void OnInitialized()
{
currentPage.SetCurrentPageName("The Home Page");
base.OnInitialized();
}
void ChangeName() => currentPage.SetCurrentPageName("Name changed");
}
и, наконец, на вершине NavMenu.razor
:
@inject CurrentPage currentPage
и далее вниз.
<p>The current page is @currentPage.CurrentPageName</p>
@code {
protected override void OnInitialized()
{
// if the OnChange event is raised, refresh this view
currentPage.OnChange += () => StateHasChanged();
base.OnInitialized();
}
Этот класс состояний не знать что-либо о том, как оно используется, и об отсутствии передаваемых объектов или ссылок.
[EDIT] Я решил, что шаблон ввода / переопределения для установки имени страницы довольно unBlazor, поэтому я также написал компонент для упростите это - PageName.razor:
@inject CurrentPage currentPage;
@code {
[Parameter]
public string Name { get; set; }
protected override void OnParametersSet()
{
currentPage.SetCurrentPageName(Name);
}
}
Теперь любая страница, желающая установить заголовок, может сделать это:
@page "/fetchdata"
@inject HttpClient Http
<PageName Name="Weather forecast page!" />
Весь потребитель теперь является компонентом:)