浏览器意外刷新时的 Blazor WebAssembly 生命周期方法

Blazor WebAssembly Lifecycle Methods when accidentally Browser refreshes

我正在习惯 Blazor WASM。 我有一些页面继承自自定义基础 class。 在这个基础中 class 我有一个级联参数。

 public class CustomBlazorComponentBase : LayoutComponentBase
    {
        private bool disposedValue;

        [Inject]
        protected HttpInterceptorService Interceptor { get; set; }

        [CascadingParameter]
        protected TelerikNotification Notification { get; set; }

        protected override Task OnInitializedAsync()
        {
            Interceptor.RegisterEvent(Notification.ShowError);

            return base.OnInitializedAsync();
        }   
}

在 MainLayout.razor 我得到了以下几行

<CascadingValue IsFixed="true" Value="@Notification">
                <div class="content px-4">
                    @Body
                </div>
</CascadingValue>            
<TelerikNotification @ref="@Notification" Class="notification"
                                 HorizontalPosition="@NotificationHorizontalPosition.Center"
                                 VerticalPosition="@NotificationVerticalPosition.Bottom" />

页面开始

@inherits ItnBlazorComponentBase 

HttpInterceptor-Class 获取委托以在出现问题时显示错误。 一切正常,符合预期。

但是当用户不小心按下浏览器的 F5 键来刷新页面时,不会调用生命周期方法。不是 OnInitializedAsync,不是 OnParametersSetAsync 等等。

为什么?以及如何避免这个问题? 问题是,我的代表将不会注册,因此不会显示任何通知。

谢谢!

经过几个小时的研究回答我自己的问题。它非常简单,并在 Whosebug

的这个问题中得到了回答

解决方案是用布尔值

包围 MainLayout.razor 中的 CascadingParameter
        @if (HasRendered)
        {
            <CascadingValue IsFixed="true" Value="@Notification">
                <div class="content px-4">
                    @Body
                </div>
            </CascadingValue>
        }

并在代码隐藏 MainLayout.razor.cs 中设置它在第一次渲染后

    protected override void OnAfterRender(bool firstRender)
    {
        if(firstRender)
        {
            HasRendered = true;
            StateHasChanged();
        }

        base.OnAfterRender(firstRender);
    }

我应用了您的解决方案,但问题仍未解决,刷新页面时级联参数丢失 @if(已渲染) { @Body

        }

然后我定义了 bool 变量 HasRendered 并将下面的代码粘贴到 MainLayout.razor.cs 受保护的覆盖 void OnAfterRender(bool firstRender) { 如果(第一次渲染) { HasRendered = true; StateHasChanged(); }

    base.OnAfterRender(firstRender);
}