在我的 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();
}
这是正常的,该页面渲染了两次。如果您希望页面禁用预渲染,您可以使用
@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();
}
您可以执行此操作来检查是否正在预渲染,然后短路页面渲染。
@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);
}
}