我有一个服务器端Blazor应用程序,它有一个简单的index.razor页面。我的目标是阅读sessionStorage并使用它的内容。但现在,我正试图迈出一小步来了解正在发生的事情
这是html
@inject Blazored.SessionStorage.ISessionStorageService sessionStorage
<button @onclick="TestInc">TEST</button>
<h1>@tutu</h1>
我只有一个显示数字的文本和一个增加值的简单按钮这是代码
@code {
private int tutu = 0;
public string sNom;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
bool isConnected = await sessionStorage.GetItemAsync<bool>("isConnected");
//if (!isConnected)
//{
// NavManager.NavigateTo("/Login", forceLoad: true);
//}
sNom = sessionStorage.GetItemAsync<string>("Nom").Result;
}
}
private void TestInc()
{
tutu += 1;
}
}
出于某种原因,如果我对整个OnAfterRenderAsync
函数进行注释,代码就可以正常工作。当我点击按钮时,页面会显示计数器并更新它。然而,如果我取消了函数OnAfterRenderAsync
的注释并按它的方式操作,则计数器根本不会更新,如果我在TestInc
中放入断点,则它永远不会到达它
我对Blazor还比较陌生,所以我可能错过了一些非常明显的东西。
我真正想实现的是获得sessionStorage变量(例如用户名(,并在HTML中显示它,而无需单击按钮或重新加载页面
解决方案很简单:
//sNom = sessionStorage.GetItemAsync<string>("Nom").Result;
sNom = await sessionStorage.GetItemAsync<string>("Nom");
- 永远不要使用
.Result
或.Wait()
- 始终致力于一条完整的"等待链">
- 处理";缺少等待";以及";不等待";警告,就好像它们是错误一样
如果您的sessionStorage有一个名为Nom 的项目,这将起作用
sNom = await sessionStorage.GetItemAsync<string>("Nom");