我正在尝试在 Blazor 服务器端项目中创建我的第一个 Razor 组件。 Razor 组件名为 MyComponent
并具有一个配置为从输入检索其值的属性:
MyComponent.razor
[Parameter]
public int Count {get; set;}
我从通过 IServiceCollection
配置的注入(inject)服务中提取计数,如下所示:
public interface ICountingService
{
ValueTask<int> Get();
}
托管页面 Index.razor
如下所示:
@page "/"
@inject ICountingService Counter
<h1>Hello World!</h1>
<MyComponent Count="@Counter.Get()" />
但是,我似乎无法为 Count
属性绑定(bind)正确的值。
我收到以下错误:
cannot convert from 'System.Threading.Tasks.ValueTask<int>' to 'int'
我发现的为 Razor 组件分配 [Parameter]
值的所有示例都是同步的,我发现的唯一异步值是回调和方法(而不是参数)。
此外,在线搜索没有返回任何明显的结果,因此我在这里发帖希望找到答案。
请注意,我知道使用 protected 覆盖异步任务 OnInitializedAsync 并在其中存储值,但与上述方法相比,这似乎需要很多仪式,特别是在考虑多个服务时以及我最终必须绑定(bind)的属性。
那么,如何以我喜欢的方式将异步调用中的值分配给 Razor 组件 [Parameter]
属性?
最佳答案
问题是,Counter.Get()
不是一个 int 值;它是一个在现在或将来某个未定义点具有 int 的任务。因此,您现在无法将其值分配给需要 int 的对象,因为该 int 不一定存在。
你已经得到了答案,虽然“看起来像是很多仪式”,但这实际上是做到这一点的唯一方法:
- 创建一个 int 属性来保存该值。
- 声明异步方法
- 在该方法中,将
Counter.Get()
的await
值分配给保存该值的 int - 将组件的 Count 属性设置为等于 int 属性
这可能感觉像是很多仪式,但你应该心存感激。异步本质上是非常复杂的,并且使用 async/await 已经可以为您处理大约 95% 的艰苦工作。如果您认为这个解决方案很困惑,您应该看看如何才能在没有 async/await 的情况下实现它!
关于razor - 如何将异步值分配给 Razor 组件 [参数] 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60324125/