c# - 带非字符串的两种方式数据/事件绑定 (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 本身很新,所以我不确定去这里的最佳途径是什么......有什么建议吗?谢谢!
解决方案
当您告诉 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
希望这可以帮助...
推荐阅读
- php - PHP Wamp 服务器 - 一台服务器上有 2 个 SSL 证书
- validation - Golang 验证器:structExcept
- javascript - React / PrimeReact 应用程序未使用 JSON 从 Web 服务呈现数据表内容
- swift - UIView 未使用模型初始化
- php - 在 Symfony 中反序列化对象的索引数组
- sql - 选择一行Oracle中的所有值(所有行)
- java - 更新了错误“JDK7u25 Codebase manifest 属性应该用于限制 JAR 再利用。请设置 manifest.custom.codebase”的解决方案
- r - 应用 fGarch 包拟合简单 GARCH 模型时的警告消息
- c# - VS2019社区升级到专业版报错CS0579
- vulkan - vkQueuePresentKHR 上的 vkMapMemory 验证错误,但从未直接调用该函数