c# - 在 Blazor View 中调用异步方法

标签 c# blazor blazor-server-side

我有一个服务器端 blazor 客户端,我正在尝试通过登录检查来修改 MainLayout razor 页面。我目前正在使用 Blazored 进行本地存储保存,并且我目前正在使用来查看是否保存了 token 以查看用户是否已登录,但是我不确定如何在 razor 页面的 if 语句中翻译它,因为它想要异步方法。

我的登录检查非常简单,如下所示。

public async Task<bool> IsLoggedIn()
{
    return await m_localStorage.ContainKeyAsync("token").ConfigureAwait(false);
}

在我的 Razor 页面中,我正在执行此语句检查 - 这显然不起作用,因为没有异步修饰符
@if (!await AppState.IsLoggedIn()) //Requires async modifier
{
    <a href="Login" target="_blank">Login</a>
}

我也尝试过使用 .Result 属性,但这会导致抛出异常:(System.AggregateException: 'Information: Executed an implicit handler method, returned result Microsoft.AspNetC)' with an internal-exception -> NullReferenceException : 你调用的对象是空的。

但是从我可以看到 AppState 被正确注入(inject),并且本地存储似乎在 AppState 中被正确注入(inject)。
@if (!AppState.IsLoggedIn().Result)
{
    <a href="Login" target="_blank">Login</a>
}

所以我的问题是解决这个问题的正确方法是什么,有没有办法在 Razor 页面中执行异步方法?

最佳答案

is there a way to execute async methods in razor pages?



不,没有办法在 Razor 组件中使用 await。这是因为您不能将异步工作作为组件渲染的一部分。

顺便提一下,Blazor 团队提供的本地存储机制支持数据保护,建议 Steve Sanderson 使用。

注意:组件的 async Lifecycle 方法是完成异步工作的地方,因此您可以相应地设计代码,例如,从 OnInitializedAsync 调用 AppState.IsLoggedIn(),并将返回的值分配给本地变量,该变量可以是从您的 View 访问。

关于c# - 在 Blazor View 中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58358900/

相关文章:

c# - EF 可以使用影子属性制作多列索引吗?

c# - 您将如何对两个矩阵的位置进行插值?

c# - 如何将输入值绑定(bind)到 Blazor 中的对象属性

c# - 从 Blazor 上的串行端口读取

c# - 在div或元素外部单击以在Blazor上将其关闭的事件

data-binding - Blazor:绑定(bind)到 MultiSelectList(最好带有复选框)

c# - 验证十进制数的正则表达式

c# - 为什么只有当鼠标悬停在 TreeNode 的文本区域上时,TreeView.NodeMouseHover 事件才会发生?

c# - 如何更新Blazor View?

c# - 如何在 Blazor 中动态设置 ValidationMessage<TValue>.For 属性?