首页 > 解决方案 > 带非字符串的两种方式数据/事件绑定 (Blazor)

问题描述

是否可以通过两种方式绑定或绑定到 Blazor 中带有非字符串的事件?我已经用文本完成了这个,没有问题,但是任何其他类型的对象都会给我带来问题。

例如,我有一个方法在输入文本时执行,该方法基于输入的值以及表单上的其他几个输入。

<InputNumber step=".01" class="form-control form-control-xs" @bind-Value="@Salary" @bind-Value:event="onkeydown"/>

private decimal salary {get; set;}
public decimal Salary
{
      get
      {
          return salary;
      }
      set
      {
          salary = value;
          CalculationHere();
      }
}

当我这样做时,我收到以下错误:

在此处输入图像描述

我也尝试过将它作为参数传递,如下所示:

@oninput="@((ChangeEventArgs __e) => CalculationHere(Convert.ToDecimal(__e.Value)" 

这也不起作用,因为当文本框为空并且不会为所有输入触发时会导致错误(也尝试过 keydown)。还有很多参数,所以如果可能的话,我想避免这种情况。

我还应该注意,当我运行这个项目时,在被调用的方法中设置一个断点,并像下面这样绑定,它确实有效。但是,删除断点会阻止它工作。这让我很困惑。

<InputNumber step=".01" class="form-control form-control-xs" @bind-Value="@Salary" @oninput="(() => CalculationHere())"/>

有没有关于这方面的最佳实践?我是 Web 开发的新手,Blazor 本身很新,所以我不确定去这里的最佳途径是什么......有什么建议吗?谢谢!

标签: c#asp.net-coredata-binding.net-coreblazor

解决方案


当您告诉 Blazor 它应该通过诸如 onkeydown 之类的事件更新变量的值时,它不知道如何处理提供给它的事件参数。在这种情况下要实现双向绑定,您需要手动进行绑定。

@oninput使用值向 InputNumber 组件添加指令"@((e) => @employee.Salary = Convert.ToDecimal(e.Value))"

您的 InputNumber 组件应如下所示:

<InputNumber step=".01" class="form-control form-control-xs" @bind-Value="@employee.Salary" @oninput="@((e) => @employee.Salary = Convert.ToDecimal(e.Value))" />

现在,每当您的文本框的输入发生更改时,都会触发输入事件,并将 ChangeEventArags 传递给您,您提取该值,将其转换为十进制并将其分配给 @employee.Salary 属性。

这个答案可以从我使用的第一个答案中推断出来

@oninput="@((e) => CalculationHere(e))" 

调用 CalculationHere

希望这可以帮助...


推荐阅读