带非字符串的双向数据/事件绑定(Blazor)

时间:2019-10-18 16:53:14

标签: c# asp.net-core data-binding .net-core 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();
      }
}

执行此操作时,出现以下错误:

enter image description here

我也尝试过像这样将其作为参数传递:

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

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

我还应该注意,当我运行该项目时,在要调用的方法中设置一个断点,并像下面那样进行绑定,它确实可以工作。但是,删除断点将使其无法工作。这让我非常困惑。

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

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

2 个答案:

答案 0 :(得分:0)

  • InputNumber组件应嵌入到其Model属性设置为您的模型雇员的EditForm组件中

  • 您不应添加@bind-Value:event="onkeydown"。做什么的 ?绑定的默认事件和正确事件是onchange事件,它适当地处理了Salary属性的更新。

将此代码放入“索引”页面并运行

<EditForm Model="@employee" OnValidSubmit="@HandleValidSubmit">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <InputText id="name" @bind-Value="@employee.Name" />

    <!-- <InputNumber step=".01" class="form-control form-control-xs" @bind-Value="@employee.Salary" /> -->

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


    <button type="submit">Submit</button>
</EditForm>

<p>Salary: @employee.Salary</p>
<p>After calculation: @calculation</p>

@code{
 decimal calculation;

        Employee employee = new Employee() { Name = "Davolio Nancy", Salary =   234 } ;



    public class Employee
    {

        public string Name { get; set; }
        private decimal salary { get; set; }

        public decimal Salary
        {
            get
            {
                return salary;
            }
            set
            {
                salary = value;

                //CalculationHere();
            }
        }
    }

    private void HandleValidSubmit()
    {

    }

     void CalculationHere(ChangeEventArgs e)
{


    calculation = Convert.ToDecimal(e.Value) * Convert.ToDecimal(1.2);
}
}

答案 1 :(得分:0)

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

@oninput的{​​{1}}指令添加到您的InputNumber组件中

您的InputNumber组件应如下所示:

"@((e) => @employee.Salary = Convert.ToDecimal(e.Value))"

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

这个答案可以从我使用的第一个答案中得出

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

调用CalculationHere

希望这对您有帮助...