【问题标题】:Blazor - detect when any form value changesBlazor - 检测任何表单值何时更改
【发布时间】:2021-03-08 13:28:03
【问题描述】:

在 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();
   }
}

在上面的表格中,我有两个字段——“FirstName”和“Surname”,它们是“Person”类的属性。每个属性都有一个输入文本框。每当任一文本框中的值发生更改时,都会调用相应的方法来更新属性值,并指示表单数据已更改。

为每个表单项设置一个事件处理程序似乎有些过分,因为在每种情况下,它真正所做的只是 @bind="" 所做的,加上将 dataChanged 设置为 true。

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

【问题讨论】:

  • 也许你不需要那个布尔值?你真正想达到什么目标?
  • 您正在这样做,就像您使用 react 一样。将您的值绑定到@bind-Value,而不是值
  • 我想我的回答对你没有用,对吧?请不要害羞,告诉我们您在寻找什么。
  • @enet 非常有用,谢谢。直到现在我才得到改变来尝试它。它工作得非常出色。再次感谢。

标签: blazor


【解决方案1】:

您应该使用原生的表单组件,例如 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);

    }
    
}

注意:从事件处理程序中为ClickChange 等 UI 事件调用 StateHasChanged() 方法是多余的。它由框架自动调用。

【讨论】:

  • 这就像一个绝对的魅力。这正是我想要的谢谢。我已经在使用表单组件了——我只是将它们从我的示例中剥离出来以使其尽可能简单(尽管在这种情况下它对我不利)。
  • 有什么方法可以使用 html 标签而不是 标签
猜你喜欢
  • 2019-05-07
  • 2010-10-09
  • 2013-05-16
  • 1970-01-01
  • 2017-10-03
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多