Edu*_*elo 14 asp.net-core blazor-server-side asp.net-blazor
我正在关注 NDC Oslo 的示例应用程序,即以下应用程序: https: //github.com/SteveSandersonMS/presentation-2019-06-NDCOslo/tree/master/demos/MissionControl。这实现了 JWT 作为身份验证和授权。但是,当我尝试将代码的实现复制到服务器端 Blazor 时,当我尝试从本地存储中获取存储的 JWT 令牌(如下所述)时,我收到错误消息”
JavaScript interop calls cannot be issued at this time. This is because the component is being
statically rendererd. When prerendering is enabled, JavaScript interop calls can only be performed
during the OnAfterRenderAsync lifecycle method.
Run Code Online (Sandbox Code Playgroud)
这是我的 blazor 代码
protected override async Task OnInitializedAsync()
{
var token = await TokenProvider.GetTokenAsync();
Branches = await Http.GetJsonAsync<List<BranchDto>>(
"vip/api/lookup/getbranches",
new AuthenticationHeaderValue("Bearer", token));
}
Run Code Online (Sandbox Code Playgroud)
错误来自
public async Task<string> GetTokenAsync()
{
//Code Omitted for brevity
//This line of code is equivalent to the IJSRuntime.Invoke<string>("localstorage.getitem","authToken")
//change to use Blazore.LocalStorage.
var token = await _localStorageService.GetItemAsync<string>("authToken");
return token;
}
Run Code Online (Sandbox Code Playgroud)
我尝试在OnAfterRenderAsync(bool firstRender)上执行代码,错误消失了,但绑定到 API 请求的网格没有显示。API 请求必须填充网格的数据源,该数据源必须为OnInitializedAsync。有什么解决方法吗?
更新! 我移动了 OnAfterRenderAsync 代码并添加了 StateHasChanged 方法,我得到了所需的行为。我忘记了渲染的连接是 signalR 连接。
pok*_*oke 30
根据文档的 \xe2\x80\x9cPrerendering\xe2\x80\x9d 部分,您只能在OnAfterRenderAsync
生命周期方法中安全地运行互操作代码。
但是,由于它在渲染周期之后运行,因此您需要使用以下命令通知组件重新渲染StateHasChanged()
在异步进程完成后通知组件重新渲染:
protected override async Task OnAfterRenderAsync(bool firstRender)\n{\n if (firstRender)\n {\n var token = await TokenProvider.GetTokenAsync();\n Branches = await Http.GetJsonAsync<List<BranchDto>>(\n "vip/api/lookup/getbranches",\n new AuthenticationHeaderValue("Bearer", token));\n\n StateHasChanged();\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
32570 次 |
最近记录: |