EditContext OnFieldChanged 报告错误的返回类型

use*_*476 5 c# eventhandler blazor blazor-server-side

我在 razor 文件中有以下 3 种方法

    protected override async Task OnInitializedAsync()
    {
        EditContext = new EditContext(_projectModel);
        EditContext.OnFieldChanged += EditContext_OnFieldChanged;
    }
    
    
    private async Task EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
    {
        await SetOkDisabledStatus();
    }
    
Run Code Online (Sandbox Code Playgroud)

这个方法是一个异步方法,我必须在调用它的任何地方等待它

    private async Task SetOkDisabledStatus()
    {
        if (EditContext.Validate())
        {
            OkayDisabled = null;
            await JsRuntime.InvokeVoidAsync("Animate");
        }
        else
        {
            OkayDisabled = "disabled";
        }
    }
    
    
Run Code Online (Sandbox Code Playgroud)

我正在 Blazor 服务器应用程序中使用 EditContext 进行验证。

我在 OnInitializedAsync() 方法下面的这一行收到错误消息,但不知道如何继续处理。

    EditContext.OnFieldChanged += EditContext_OnFieldChanged;
Run Code Online (Sandbox Code Playgroud)

错误信息:

任务 MyProject.EditContext_OnFieldChanged(object, FieldChangedEventArgs)' 的返回类型错误。

需要一个带有 void EditContext_OnFieldChanged(object?, FieldChangedEventArgs e) 的方法

请注意,我正在使用 sonarqube 来检查我的所有代码。

Hen*_*man 3

生成的 Blazor 事件处理程序(如@onclick="...")对于返回类型和参数很灵活,但EditContext.OnFieldChanged事实并非如此,它具有固定的委托类型。

进行以下更改:

//private async Task EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
  private async void EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
  {
     await SetOkDisabledStatus();
     StateHasChanged();  // make sure OkayDisabled takes effect
  }
  
Run Code Online (Sandbox Code Playgroud)

另一方面,您可以将 OkDisabled 设置为布尔值并disabled="@OkayDisabled"在需要的地方使用它。当您使用 分配该属性时,
Blazor 会使该属性消失。disabledfalse


替代方案:保持验证同步。正如@Mister Magoo 指出的那样,这可能会防止一些问题。然后只让动画异步运行。

private void EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
{
   SetOkDisabledStatus();  
}

private void SetOkDisabledStatus()
{
    if (EditContext.Validate())
    {
        OkayDisabled = null; 
        _ = JsRuntime.InvokeVoidAsync("Animate");  // no await, on purpose
    }
    else
    {
        OkayDisabled = "disabled";
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下不需要 StateHasChanged()。