考虑以下代码片段:
@page "/"
@using System.ComponentModel.DataAnnotations
<EditForm Model="@person" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<InputText id="name" @bind-Value="person.Name" />
<button type="submit">Submit</button>
</EditForm>
<p>@message</p>
@code {
readonly Person person = new();
string message;
void HandleValidSubmit()
{
message = "Name = " + person.Name;
}
private class Person
{
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; }
}
}
复制问题的步骤:
- 运行应用程序
- 不要在名称文本输入 中输入任何内容
- 单击Submit
- 注意"Name is required"出现验证消息
- 输入名称"在名称文本中输入
- 单击Submit
- 观察验证消息消失
- 点击再次提交
- 观察"Name = Joe"消息出现。
在第二次单击Submit按钮(步骤6)之后,OnValidSubmit
事件似乎没有触发,即使表单现在是有效的。我必须再次单击它(步骤8)。为什么会这样,我如何才能让OnValidSubmit
在步骤6中开火?
你有一个css问题,当你在释放按钮之前按下按钮,按钮改变了位置,所以你根本没有点击按钮。
像这样修改代码
<EditForm Model="person" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<InputText id="name" @bind-Value="person.Name" />
<button type="submit">Submit</button>
<ValidationSummary />
</EditForm>
当您使用鼠标将焦点从输入控件转移到按钮时,会发生两个重叠的事件。
- 你已经离开了
InputText
,所以有一个onChange
事件被触发。 - 你已经点击了按钮,所以有一个
onClick
事件被引发。
当第一个事件发生时,验证改变,按钮的位置改变。点击空格,所以没有OnClick
事件发生。