在 Blazor 预渲染步骤期间 NavigateTo 是否应该引发异常?

问题描述 投票:0回答:2

在我的 blazor 应用程序中,我有一个页面,用于检查

Task OnParametersSetAsync()
中的一些数据,并可能根据该数据的状态进行重定向。在预渲染上,我在调用
NavigationException
时得到一个通用的
NavigateTo("my/other/page")
,然后在预渲染和导航成功后再次运行所有内容。

这正常吗?也许我应该将此检查移至另一个不在预渲染上运行的地方,但是如何?

// Landing page from a 3rd party. Check if updates to data from 3rd party are ready
protected override async Task OnParametersSetAsync()
{
    await RedirectIfDataIsReady();

    await base.OnParametersSetAsync();
}
asp.net-core blazor
2个回答
0
投票

这是正常的,该页面渲染了两次。如果您希望页面禁用预渲染,您可以使用

@rendermode @(new InteractiveServerRenderMode(false))

如果您仍然希望页面预渲染,您可以使用
IHttpContextAccessor
检查代码是否正在预渲染。 如果代码是预渲染的,“Response.HasStarted”将为 false。

builder.Services.AddHttpContextAccessor();
@inject IHttpContextAccessor accessor
...
    protected override async Task OnParametersSetAsync()
    {
        if (!accessor.HttpContext.Response.HasStarted)
        {
            await RedirectIfDataIsReady();
        };
        await base.OnParametersSetAsync();
    }

0
投票

您可以执行此操作来检查是否正在预渲染,然后短路页面渲染。

@code {
    [CascadingParameter] private HttpContext? httpContext { get; set; }
    private bool _isPreRender => httpContext is not null;

    public override Task SetParametersAsync(ParameterView parameters)
    {
        parameters.SetParameterProperties(this);

        // Don't do anything - short circuit
        if (_isPreRender)
            return Task.CompletedTask;

        return base.SetParametersAsync(ParameterView.Empty);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.