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 来检查我的所有代码。
生成的 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 会使该属性消失。disabled
false
替代方案:保持验证同步。正如@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()。
归档时间: |
|
查看次数: |
1862 次 |
最近记录: |