在 Blazor 表单中,我希望能够检测表单值何时发生更改,并设置一个布尔值作为结果。
这是一些代码来说明我目前是如何做的:
<EditForm Model="Person" OnValidSubmit="OnSubmitValidateForm">
<div class="form-group">
<label>First Name</label>
<input type="text" value="@Person.FirstName" @onchange="OnFirstNameChanged" />
</div>
<div class="form-group">
<label>Surname</label>
<input type="text" value="@Person.Surname" @onchange="OnSurnameChanged" />
</div>
<input type="submit" class="btn btn-primary" value="Save"/>
</EditForm>
@code {
Person Person = new Person();
bool dataChanged = false;
void OnFirstNameChanged(ChangeEventArgs e)
{
Person.FirstName = e.Value.ToString();
dataChanged = true;
StateHasChanged();
}
void OnSurnameChanged(ChangeEventArgs e)
{
Person.Surname = e.Value.ToString();
dataChanged = true;
StateHasChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的表单中,我有两个字段 - “FirstName”和“Surname”,它们是“Person”类的属性。每个属性都有一个绑定的输入文本框。每当任一文本框中的值发生更改时,都会调用相应的方法,该方法将更新属性值,并指示表单数据已更改。
为每个表单项都有一个事件处理程序似乎有点过多,因为在每种情况下它真正做的就是 @bind="" 所做的事情,再加上将 dataChanged 设置为 true。
我的问题是,虽然该方法有效,但似乎我必须编写大量额外的代码。有更好的方法来处理这个问题吗?
您应该使用本机表单组件,例如InputText、InputDate 等,并实现该OnFieldChanged事件。模型中的每个字段都会引发 OnFieldChanged 事件。
代码示例
@page "/"
@using Microsoft.AspNetCore.Components.Forms;
<EditForm EditContext="@ValidationContext.EditContext"
OnValidSubmit="HandleValidSumit">
<DataAnnotationsValidator />
<div class="form-group">
<label for="name">FirstName: </label>
<InputText Id="FirstName" Class="form-control" @bind-
Value="@person.FirstName"></InputText>
<ValidationMessage For="@(() => person.FirstName)" />
</div>
<div class="form-group">
<label for="body">Surname: </label>
<InputText Id="body" Class="form-control" @bind-
Value="@person.Surname"></InputText >
<ValidationMessage For="@(() => person.Surname)" />
</div>
<button type="submit" class="btn btn-success">Submit</button>
</EditForm>
@code
{
Person person = new Person();
protected override void OnInitialized()
{
EditContext = new EditContext(person);
EditContext.OnFieldChanged += EditContext_OnFieldChanged;
base.OnInitialized();
}
private async Task HandleValidSumit()
{
Console.WriteLine("Saving...");
Console.WriteLine(person.FirstName);
Console.WriteLine(Person.Surname);
}
// Note: The OnFieldChanged event is raised for each field in the
// model
private void EditContext_OnFieldChanged(object sender,
FieldChangedEventArgs e)
{
Console.WriteLine(e.FieldIdentifier.FieldName);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:从、StateHasChanged等 UI 事件的事件处理程序中调用 () 方法是多余的。它由框架自动调用。ClickChange
| 归档时间: |
|
| 查看次数: |
9873 次 |
| 最近记录: |