Страница блейзора не отображается повторно после обновления параметра

#c# #blazor

#c# #блейзор

Вопрос:

Я начал с нового ASP.NET основное веб-приложение и шаблон на стороне клиента blazor ( 3.0.0-preview4-19216-03 ).

Чтобы добавить состояние на существующую Counter.razor страницу, я добавил следующий класс:

 public class GlobalCounter
{
    private int _count;
    public int Count
    {
        get => _count;
        set
        {
            if (_count == value) return;

            _count = value;
            CounterChanged.Invoke(this, new CounterChangedEventArgs(_count));
        }
    }

    public GlobalCounter(int initialCount = 0)
    {
        _count = initialCount;
    }

    public event EventHandler<CounterChangedEventArgs> CounterChanged;
}

public class CounterChangedEventArgs : EventArgs
{
    public int Count { get; }
    public CounterChangedEventArgs(int count)
    {
        Count = count;
    }
}
  

Внутри Startup.cs добавлено следующее к методу ConfigureServices:

 public void ConfigureServices(IServiceCollection services)
{
    var counter = new GlobalCounter();
    services.AddSingleton(counter);
}
  

Затем я добавил синглтон, который будет введен на Counter.razor страницу:

 @inject GlobalCounter _counter;
  

Также добавлен следующий код к @functions странице:

 protected override async Task OnInitAsync()
{
    currentCount = _counter.Count;
    _counter.CounterChanged  = CounterChanged;
    await Task.CompletedTask;
}

void CounterChanged(object sender, CounterChangedEventArgs args)
{
    currentCount = args.Count;
}

void IncrementCount()
{
   _counter.Count  ;
}
  

До сих пор все работало так, как ожидалось, при выходе со страницы или перезагрузке сохранится старый счет.

Затем я настроил index.razor, чтобы ввести счетчик и отобразить количество нажатий.

 @page "/"
@inject GlobalCounter _counter;

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

You pressed the counter @totalCount times.

@functions {
    private int totalCount = 0;

    protected override async Task OnInitAsync()
    {
        totalCount = _counter.Count;
        _counter.CounterChanged  = CounterChanged;
        await Task.CompletedTask;
    }

    void CounterChanged(object sender, CounterChangedEventArgs args)
    {
        totalCount = args.Count;
    }
}
  

Это также работает так, как ожидалось. Нажатие кнопки «нажмите меня» на странице счетчика и переход обратно на страницу индекса покажет правильное количество.

Здесь возникает моя проблема, как только я добавлю <Counter /> страницу в качестве компонента в index.razor , нажатие кнопки «нажмите меня» обновит количество внутри компонента, но не текст, отображаемый на индексной странице.

демонстрация проблемы с отображением блейзора

Требуется ли явный вызов для повторного отображения зависимых компонентов или какой-либо конкретной привязки между страницами?

Комментарии:

1. Отличная идея включить Gif. Намного упрощает понимание вашей проблемы 🙂

Ответ №1:

Попробуйте это в index.razor:

 void CounterChanged(object sender, CounterChangedEventArgs args)
{
    totalCount = args.Count;

    StateHasChanged();
}
  

Вы должны сообщить Blazor, что состояние компонента изменилось и что она должна выполнить повторный рендеринг.

Между прочим, значение в компоненте счетчика обновляется автоматически, потому что метод StateHasChanged вызывается Blazor после запуска события нажатия кнопки «Click me». Метод StateHasChanged автоматически вызывается после возникновения событий любого типа…