razor - 如何将异步值分配给 Razor 组件 [参数] 属性?

标签 razor .net-core blazor blazor-server-side razor-components

我正在尝试在 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/

相关文章:

azure - Azure 中的 Blazor : The list of component records is not valid

javascript - 将 Javascript 结果传递给 View

c# - 如何让运行在ubuntu机器上的.net core与本地数据库连接

oracle - System.Data.OracleClient 和 .Net Core 2 : Additional symbol some times?

blazor - 在 Blazor 中,如何使对注入(inject)对象的更改反射(reflect)在所有组件中? (又名 react 性)

c# - 我可以使用 Visual Studio C# 类库项目引用 Blazor 项目

c# - 如何查找/呈现预编译的 Razor View

c# - 在 View 中显示字符串?

jquery - 浏览器问题的多个打开选项卡的客户端脚本变量范围

c# - 如何在 ASP.net Core 中使用按钮导航到新页面?