当使用另一个剃须刀组件中的组件时,通常需要调用由EventCallback属性触发的异步方法,例如onClick.有什么特殊的方式调用它以确保异步性吗?

让我们假设下面的例子:

@* CASE 1*@
<MyButton OnClick=DoSomething>Click Me</MyButton>

@* CASE 2*@
<MyButton OnClick=@(async () => await DoSomething())>Click Me</MyButton>

@code {
    private async Task DoSomething(){ ... }
}

编译后,使用委托和直接调用函数有什么区别吗?我们应该 Select 一个还是另一个?

这个问题并不是由于错误或代码运行不正确而引起的,而只是因为我没有从Visual Studio获得反馈这一事实,而且可能是出于很好的原因,但我想知道我是否以任何一种方式编写了不正确的代码.

Select 备注:很难为所有人 Select 一个单一的答案,为讨论提供有效的观点,鼓励进一步阅读.这种混淆似乎源于对委托在调用堆栈中的角色的误解,在这种情况下,我认为Shaun的回答显示了最简洁和明确的例子.

推荐答案

在这个特定的情况下,第一个更好.

此代码块将任务包装在任务中.它浪费资源:每个任务都是一个状态机对象.

OnClick=@(async () => await DoSomething())>

然而,实际发生的情况取决于MyButton.

这是一个演示版本.我已经添加了两个按钮事件处理程序,每个按钮事件处理程序都有关于如何执行的注释.

<button @attributes=this.AdditionalAttributes @onclick=this.OnButtonClickAsync></button>

@code {
    [Parameter] public EventCallback<MouseEventArgs> OnClick { get; set; }
    [Parameter] public RenderFragment? ChildContent { get; set; }
    [Parameter(CaptureUnmatchedValues = true)] public Dictionary<string, object>? AdditionalAttributes { get; set; }

    private async Task OnButtonClickAsync(MouseEventArgs e)
    {
        // you are awaiting the delegate in the parent component
        // if it yields you'll await it's completion
        await this.OnClick.InvokeAsync(e);
        // Code here will only execute after the parent delegate has completed, awaits and all
        // any exceptions will bubble up to here 
    }

    private void OnButtonClick(MouseEventArgs e)
    {
        // This is a Fire and Forget call
        this.OnClick.InvokeAsync(e);
        // code here will execute as soon as the parent delegate yields
        // exceptions won't bubble up to here
    }
}

更广泛地说,这是个人喜好的问题.

我喜欢干净的标记,所以我这样编写代码.

<button disabled="@buttonCss"></button>

@code {
    private bool _isDisabled;
    private string buttonCss => _isDisabled ? "btn btn-danger" : "btn btn-success";
}

其他人喜欢简洁的[内联]代码.

<button disabled="@(_isDisabled ? "btn btn-danger": "btn btn-success")"></button>

@code {
    private bool _isDisabled;
}

Asp.net相关问答推荐

为什么微软决定支持 jQuery 如此重要?

/应用程序中的服务器错误. ASP.NET

说服遗留应用程序 VB6 开发人员切换到 C#

是否可以访问位于另一个项目中的 MVC 视图?

解析器错误消息:文件/TestSite/Default.aspx.cs不存在

在 ASP.NET 中更改错误消息的语言

相当于服务器端的 ASP.NET 包括

如何将 ASP.NET MVC5 身份验证添加到现有数据库

如何将 css 类添加到 ASP.Net 中的更新面板?

每个 'HttpRequest' 在 ASP.NET 中都有自己的线程吗?

ASP.NET vNext 与主机无关,这意味着什么?

带有完整内存错误的 WCF 服务(内存门判断失败,因为可用内存) - 如何解决

如何在新选项卡中打开 asp:HyperLink.NavigateUrl

如何在 ASP.Net 的客户端 (JavaScript) 上判断 Page.Validate()?

单独装配和路由中的控制器

如何在 ASP.NET 中通过 LAN 访问您的网站

VS 2010 中缺少 App_Code 文件夹

在 ASP.NET 标识中添加角色

如何判断字符串的第一个字符是否是字母,C#中的任何字母

ASP.NET MVC2/3 中runAllManagedModulesForAllRequests的正确用法是什么?