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>