Blazor PersistentState AllowUpdates作用及演示方法咨询
关于Blazor PersistentState与增强导航的解析与演示
一、PersistentState.AllowUpdates=true的核心区别
默认情况下,PersistentState是只读状态——服务端预渲染时写入的状态,客户端只能读取,无法修改后传递给后续导航的页面。
当设置AllowUpdates=true时,你可以在客户端更新PersistentState中的数据,并且在增强导航(内部页面跳转,而非硬刷新)时,这些更新后的状态会被自动传递到目标页面的服务端预渲染流程中。
举个实际场景:
- 未设置AllowUpdates:用户在页面A修改了某个筛选条件,通过增强导航跳转到页面B,页面B的PersistentState还是服务端初始渲染的旧值,无法获取用户在页面A修改的筛选状态。
- 设置AllowUpdates=true:页面A中执行
PersistentState.Set("FilterValue", "new-value")更新状态,跳转到页面B后,页面B可以通过PersistentState.Get<string>("FilterValue")拿到更新后的值,服务端预渲染时就能基于这个最新值加载数据,避免重复请求或状态丢失。
二、增强导航下PersistentState特性的演示步骤
准备工作
创建一个启用预渲染的Blazor Web App,添加两个页面:PageA.razor和PageB.razor。
步骤1:实现PageA的状态存储与更新
@page "/page-a" @inject PersistentState PersistentState @inject NavigationManager NavigationManager <h3>页面A</h3> <p>当前存储的状态值:@currentValue</p> <input @bind="currentValue" placeholder="输入新值" /> <button @onclick="UpdateStateAndNavigate">更新状态并跳转页面B</button> @code { private string? currentValue; protected override void OnInitialized() { // 读取服务端预渲染时写入的初始状态 currentValue = PersistentState.Get<string?>("DemoValue") ?? "初始默认值"; } private void UpdateStateAndNavigate() { // 只有AllowUpdates=true时,该Set操作的结果会传递到后续增强导航 PersistentState.Set("DemoValue", currentValue); NavigationManager.NavigateTo("/page-b"); } }
步骤2:配置PersistentState允许更新
在Program.cs中注册服务时开启AllowUpdates:
builder.Services.AddRazorComponents() .AddInteractiveServerComponents() .AddInteractiveWebAssemblyComponents() .AddPersistentState(options => { options.AllowUpdates = true; // 关键配置 });
步骤3:实现PageB的状态读取与场景判断
@page "/page-b" @inject PersistentState PersistentState <h3>页面B</h3> <p>从PersistentState获取的值:@stateValue</p> <p>是否为增强导航:@isEnhancedNavigation</p> @code { private string? stateValue; private bool isEnhancedNavigation; protected override void OnInitialized() { stateValue = PersistentState.Get<string?>("DemoValue") ?? "无状态数据"; // 判断当前请求是否来自内部增强导航 isEnhancedNavigation = PersistentState.IsEnhancedNavigation; } }
步骤4:验证不同场景的行为
- 硬刷新场景:直接访问
/page-a,修改输入框值后跳转页面B,能看到更新后的状态;但刷新页面B后,状态会回到服务端初始的默认值(硬刷新会重新触发完整服务端预渲染,客户端更新的状态不会保留)。 - 增强导航场景:在页面A修改值后跳转页面B,能看到更新后的状态;从页面B点击浏览器返回按钮回到页面A,再跳转页面B,依然能拿到最新值(增强导航会自动传递客户端更新后的PersistentState)。
- 禁用AllowUpdates的对比:把
options.AllowUpdates设为false,重复上述操作,页面B永远只能拿到服务端初始的默认值,页面A的Set操作不会生效。
关键注意点
- 增强导航仅适用于Blazor内部的页面跳转(
NavigationManager.NavigateTo或路由链接),硬刷新会绕过客户端状态传递流程。 PersistentState.IsEnhancedNavigation可用来判断当前是否为增强导航请求,从而决定是否复用客户端传递的状态,避免重复获取数据。
内容的提问来源于stack exchange,提问作者codelearning
相关产品推荐
相关产品推荐

