Blazor - 检测任何表单值何时发生变化

Lau*_*ost 8 blazor

在 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。

我的问题是,虽然该方法有效,但似乎我必须编写大量额外的代码。有更好的方法来处理这个问题吗?

Isa*_*aac 9

您应该使用本机表单组件,例如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

  • 我们有什么办法可以使用 &lt;input&gt; html 标签而不是 &lt;InputText&gt; 标签 (2认同)