当我通过按下删除按钮然后按下选项卡按钮清除InputNumber
控件中的值时,该值保持不变并且不会更新。
绑定InputNumber
控件的属性如下
[Required]
[RegularExpression(@"^d+.d{0,6}$", ErrorMessage = "The Price field cannot have more than 2 decimal places.")]
public decimal Price {get;set;}
如何使按下删除按钮时Price
更新为0?
我之所以想实现这一点,是因为当前的行为导致了一些问题。这里有一个例子:
在
Quantity
属性的设置器中,当设置Quantity
时,如果Quantity
和Price
不为0,则将Unit Price
设置为Price
除以Quantity
将
Price
设置为100按下删除按钮删除
Price
错误消息尖叫"The Price field is required."
,但Price
的值保持为100将
Quantity
设置为10。CCD_ 16被错误地计算为10。尽管CCD_ 18的CCD_ 17控件上显示的是空而不是100。
我试过:
在
<InputNumber>
对照上使用@OnEmptied
=>也不更新Price
的值将
decimal
转换为decimal?
这没有多大帮助,因为我仍然想验证Price
是否已进入
如有任何建议,我们将不胜感激!
完整代码如下(索引.剃刀(:
@page "/"
@using System.ComponentModel.DataAnnotations;
<EditForm Model="item">
<DataAnnotationsValidator></DataAnnotationsValidator>
<div>
<label>Quantity:</label>
<InputNumber @bind-Value="item.Quantity"></InputNumber>
<ValidationMessage For="@(()=>item.Quantity)"></ValidationMessage>
</div>
<div>
<label>Unit Price:</label>
<InputNumber @bind-Value="item.UnitPrice"></InputNumber>
<ValidationMessage For="@(()=>item.UnitPrice)"></ValidationMessage>
</div>
<div>
<label>Price:</label>
<InputNumber @bind-Value="item.Price"></InputNumber>
<ValidationMessage For="@(()=>item.Price)"></ValidationMessage>
</div>
</EditForm>
@code {
private Item item = new Item()
{
Price = 0,
Quantity = 0,
UnitPrice = 0
};
public class Item
{
private decimal _quantity;
[Required]
[RegularExpression(@"^d+.d{0,6}$", ErrorMessage = "The Qauntity field cannot have more than 6 decimal places.")]
public decimal Quantity
{
get => _quantity;
set
{
_quantity = Math.Abs(value);
if (_unitPrice == 0 && _quantity != 0 && _price != 0)
{
_unitPrice = decimal.Round(_price / _quantity, 6);
}
if (_quantity != 0 && _unitPrice != 0)
{
_price = decimal.Round(_quantity * _unitPrice, 2);
}
}
}
private decimal _unitPrice;
[Required]
[RegularExpression(@"^d+.d{0,6}$", ErrorMessage = "The Unit Price field cannot have more than 6 decimal places.")]
public decimal UnitPrice
{
get => _unitPrice;
set
{
_unitPrice = Math.Abs(value);
if (_quantity == 0 && _unitPrice != 0 && _price != 0)
{
_quantity = decimal.Round(_price / _unitPrice, 6);
}
if (_quantity != 0 && _unitPrice != 0)
{
_price = decimal.Round(_quantity * _unitPrice, 2);
}
}
}
private decimal _price;
[Required]
[RegularExpression(@"^d+.d{0,6}$", ErrorMessage = "The Price field cannot have more than 2 decimal places.")]
public decimal Price
{
get => _price;
set
{
_price = Math.Abs(value);
if (_quantity == 0 && _price != 0 && _unitPrice != 0)
{
_quantity = decimal.Round(_price / _unitPrice, 6);
}
if (_unitPrice == 0 && _price != 0 && _quantity != 0)
{
_unitPrice = decimal.Round(_price / _quantity, 6);
}
}
}
}
}
首先,正则表达式(^d+.d{0,6}$
(与所描述的所需行为不匹配。分解:
^d+
:以一个或多个十进制数字开始到目前为止很好.
:任意字符之一危险!您的输入现在至少需要2个字符长d{0,6}$
:ok结束时有0-6个十进制字符
因此10
、0.
和0d
都将匹配,但0
不匹配。您不必担心其中的一些问题,因为您使用的是数字输入,但您可能希望能够插入个位数。将正则表达式更改为^d+(?:.d{0,6})?$
:
^d+
:以一个或多个十进制数字开始仍然有效(?: ... )?$
:可选组以结束(因此小数是可选的(good- 并且分组的CCD_ 36(价格为CCD_;CCD_ 38";后面跟着0-6个十进制字符好
至于在删除其内容后将输入设置为"0",这可以通过JavaScript:轻松完成
document.querySelectorAll('form input[type="number"]')
.forEach(input => {
// input or keyup events will work
input.addEventListener('input', ({ target }) => input.value = target.value || '0')
})