C# 保存按钮不存在';t在第一次单击Blazor Web部件编辑表单中触发事件

C# 保存按钮不存在';t在第一次单击Blazor Web部件编辑表单中触发事件,c#,asp.net-core,blazor,blazor-webassembly,C#,Asp.net Core,Blazor,Blazor Webassembly,因此,我有一个EditForm组件,它具有InputText组件,该组件触发onFieldChanged事件。另外,我还有一个按钮,它使用onvalidsubmiteventcallback,然后提交表单。问题是,如果InputText处于焦点状态,并且我尝试单击保存按钮,它在第一次单击时不会触发,因为它首先调用FieldChanged事件,而不会调用OnValidSubmit事件,在第二次单击时它会起作用。如果您单击按钮中的其他位置,它也可以工作,但是在InputText之后单击不起作用 如何

因此,我有一个
EditForm
组件,它具有
InputText
组件,该组件触发
onFieldChanged
事件。另外,我还有一个按钮,它使用
onvalidsubmiteventcallback
,然后提交表单。问题是,如果
InputText
处于焦点状态,并且我尝试单击保存按钮,它在第一次单击时不会触发,因为它首先调用
FieldChanged
事件,而不会调用
OnValidSubmit
事件,在第二次单击时它会起作用。如果您单击按钮中的其他位置,它也可以工作,但是在
InputText
之后单击不起作用

如何使其在
字段更改后调用
onValidSubmit

提前谢谢

编辑

组件EditFormBody:

@inherits ComponentBase 
@typeparam TItem
<div class="panel panel-primary">
<div class="panel-heading">
    <h4 class="panel-title">@Title</h4>
    <div class="panel-heading-btn">
        <a href="javascript:;" class="btn btn-xs btn-icon btn-circle" data-click="panel-expand"><i class="fa fa-expand"></i></a>
    </div>
</div>
<div class="panel-body">
    <div class="@BodyCss">

        @if (ShowWait)
        {
            <PleaseWait />
        }
        else
        {
            <EditForm  EditContext="@FormEditContext" OnValidSubmit="@OnSave">
                <DataAnnotationsValidator />
                <div class="form-group row">
                    <div class="col-12">
                        <Microsoft.AspNetCore.Components.Forms.ValidationSummary />
                    </div>
                </div>
                <div class="form-group row">
                    <div class="col-12">
                        @ChildContent

                    </div>
                </div>
               
                                <button type="submit" class="btn btn-primary mr-1" tabindex="51" disabled="@IsReadOnly">Save</button>
                           
                        </div>
                    
                </div>
            </EditForm>
        }
    </div>
</div>
@继承ComponentBase
@typeparam滴度
@头衔
@如果(显示等待)
{
}
其他的
{
@儿童内容
拯救
}
@code{
[参数]公共滴度模型{get;set;}
[参数]公共RenderFragment ChildContent{get;set;}
[参数]公共RenderFragment LeftButtons{get;set;}
[参数]公共bool IsReadOnly{get;set;}
[参数]公共bool ShowCancel{get;set;}=true;
[参数]公共事件回调OnValidSubmit{get;set;}
[参数]公共事件回调取消{get;set;}
[参数]公共事件回调属性更改{get;set;}
私有EditContext FormEditContext{get;set;}
private bool ShowWait{get;set;}=true;
受保护的重写异步任务OnParametersSetAsync()
{
如果(型号!=null)
{
FormEditContext=新的EditContext(模型);
FormEditContext.OnFieldChanged+=OnChange;
ShowWait=false;
}
等待base.OnParametersSetAsync();
}
私有void OnChange(对象发送方,fieldchangedventargs e)
{
如果(e.FieldIdentifier.FieldName!=“CurrentValue”)
PropertyChanged.InvokeAsync(e.FieldIdentifier.FieldName);
}
保存上的专用异步任务(EditContext上下文)
{
尝试
{
ShowWait=true;
wait OnValidSubmit.InvokeAsync(上下文);
ShowWait=false;
}
捕获(例外情况除外)
{
ShowWait=false;
等待这个消息(JS,Title,ex);
}
}
专用异步任务删除()
{
尝试
{
ShowWait=true;
wait OnValidSubmit.InvokeAsync(null);
ShowWait=false;
//等待此消息。导航到(返回URL);
}
捕获(例外情况除外)
{
ShowWait=false;
等待这个消息(JS,Title,ex);
}
}}
我称之为组件的表单:

<EditFormBody Model="@CurrentObject" Mode="@Mode" Title="@Title" ReturnUrl="/administration/users" OnValidSubmit="@Save" Cancel="Cancel">
        <ChildContent>
            <InputText  @bind-Value="@CurrentObject.Email" />
        </ChildContent>
    </EditFormBody>

以下是您的代码的基本版本。这在我的测试环境中起作用——Blazor服务器项目是根据模板构建的。我已经看过你的代码,目前看不出问题所在。我建议你用这个赤裸裸的版本,检查它的工作情况,然后建立它直到你打破它。祝你好运

//BasicEditor.razor
@第页“/基本编辑器”
@信息
@代码{
公共类模型
{
公共字符串电子邮件{get;set;}
}
私有EditContext_EditContext;
私有模型模型{get;set;}=new Model(){Email=”me@you.com" };
私有字符串message=“尚未单击”;
受保护的覆盖任务OnInitializedAsync()
{
_EditContext=新的EditContext(模型);
返回base.OnInitializedAsync();
}
私有任务ValidatedSubmit(EditContext EditContext)
{
message=$“在{DateTime.Now.ToLongTimeString()}处单击”;
返回Task.CompletedTask;
}
}
//BasicEditorCard.razor
@儿童内容
提交
@信息
@代码{
[参数]公共RenderFragment ChildContent{get;set;}
[参数]公共EditContext EditContext{get;set;}
[参数]公共事件回调OnValidSubmit{get;set;}
私有字符串消息=“否”;
私有任务ValidatedSubmit()
{
OnValidSubmit.InvokeAsync(EditContext);
message=$“在{DateTime.Now.ToLongTimeString()}处单击”;
返回Task.CompletedTask;
}
}
更新 您有两个问题:

反向逻辑
受保护的覆盖异步任务OnParametersSetAsync()
{
//应为if(模型为null)
如果(型号!=null)
{
FormEditContext=新的EditContext(模型);
FormEditContext.OnFieldChanged+=OnChange;
ShowWait=false;
}
等待base.OnParametersSetAsync();
}
你的逻辑是错误的!每次参数更改时,您都在创建新的EditContext

仿制药 使用泛型也会造成问题
EditContext
接受一个
对象
,因此您可以去掉组件中的泛型,只需按如下方式声明
Model
,在过程中丢失
@typeparam TItem

[参数]公共对象模型{get;set;}
您组件的最终原型版本如下所示:

@实现IDisposable
@儿童内容
提交
@信息
@代码{
[参数]公共RenderFragment ChildContent{get;set;}
[参数]公共对象模型{get;set;}
[参数]公共事件回调OnValidSubmit{get;set;}
私有字符串消息=“否”;
受保护的编辑上下文;
受保护的覆盖任务OnParametersSetAsync()
{
如果(this.EditContext)为
<EditFormBody Model="@CurrentObject" Mode="@Mode" Title="@Title" ReturnUrl="/administration/users" OnValidSubmit="@Save" Cancel="Cancel">
        <ChildContent>
            <InputText  @bind-Value="@CurrentObject.Email" />
        </ChildContent>
    </EditFormBody>