在 Blazor 应用 Razor 页面的 InputText 中绑定类型双精度值

Posted

技术标签:

【中文标题】在 Blazor 应用 Razor 页面的 InputText 中绑定类型双精度值【英文标题】:Binding Type double values in InputText of Blazor app Razor page 【发布时间】:2021-09-17 07:43:28 【问题描述】:

我对几乎所有属性都使用 InputText。一些属性是 Double 类型。当我在 InputText 中绑定双精度值时,它给了我错误。我该如何解决这个问题?我不想使用 InputNumber。

 <div class="form-group col">
 <label title="The quantity ">Quantity</label>
 <i class="fa fa-info-circle" style="color:dimgrey" title="The quantity"> 
 </i>
 <InputText @bind-Value="@trade.qty" class="form-control" />
 <ValidationMessage For="@(() => trade.qty)" />
 </div>

我在@trade.qty 在&lt;InputText @bind-Value="@trade.qty" class="form-control" /&gt; 处遇到错误 作为它的双精度值。

型号:

 public Double qty  get; set; 

我尝试过类似&lt;InputText @bind-Value="@trade.qty.ToString()" class="form-control" /&gt; 没用。

【问题讨论】:

【参考方案1】:

我不知道你为什么想要那个功能,但是创建支持字符串属性并转换里面的数字呢?

class MyModel

    public Double qty  get; set; 
    public string qtyString
      get=>qty.ToString();
      set
        if(Double.TryParse(value, out double val))
        qty = val;
         
      

<InputText @bind-Value="@mod.qtyString"/>

Working solution.

【讨论】:

当我只想使用 InputText 时,这对我有帮助。谢谢【参考方案2】:

使用

<InputNumber @bind-Value=trade.qty min="1" max="999" />

可以绑定到double。

https://docs.microsoft.com/fr-fr/aspnet/core/blazor/forms-validation?view=aspnetcore-5.0

【讨论】:

【参考方案3】:

我认为 Mercator 的答案中的 @Alanmakanambra 和 @Guy 都可以被标记为正确,因为他们回答了这个问题。但我认为值得添加额外的评论。

不同浏览器对 html 输入的处理方式不同。尤其是在手机浏览器中,数字输入很可能会弹出一个内置控件(如小键盘)。 Blazor 控件呈现为&lt;input type="number"&gt;,每个浏览器都会显示其版本的数字输入。

如果您制作自定义控件(例如,使用文本输入来处理数字输入),那么您将绕过不同设备的原生方法来处理数字输入。对于手机,这使得用户很难(或几乎不可能)轻松输入数字信息。

有时您想绕过本机系统。也许您有一个自定义日历,并且您不希望 Apple 内置在 iPhone 中的任何日期选择器破坏您网站的外观。但一般来说,你不应该那样做。

短版:使用&lt;input type="number&gt;&lt;InputNumber&gt;

【讨论】:

【参考方案4】:

我这样做是为了浮动:

<input type="number" pattern="/^-?\d+\?\d*$/" readonly="@isReadOnly" onKeyPress="if(this.value.length==8) return false;" 
style="background-color:transparent; border:none; padding: 3px; width: 4em" 
value="@cellvalue.ToString(new System.Globalization.CultureInfo("en-US")).Replace(",",".")" 
@onchange="@((ChangeEventArgs __e) => row.SetField<float>(col, float.Parse(__e.Value.ToString().Replace(",",".")) )" size="8" step=0.01 max="9999" id="number" />

所以我使用输入类型,但是我的本地数字文化使用逗号的额外问题,我使用 onchange 和 value 替换了它,而不是直接绑定值。效果出奇的好,它甚至保留了逗号,但我可以在字段中手动输入它,也可以使用句号。 请注意,我在这里拥有的数据位于 C# DataTable 中,这就是为什么 onchange 看起来像它的样子,如果你只有一个常规的 double 来引用它会简单得多。

另一个优点是它添加了一些数字内容,因此步骤是您在元素上按向上或向下箭头,然后从值中添加或减去多少。

【讨论】:

以上是关于在 Blazor 应用 Razor 页面的 InputText 中绑定类型双精度值的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务器端 Blazor 应用程序中的 Blazor 组件调用 razor 页面而不导致页面刷新

Blazor 页面组件

Razor 页面与服务器端 Blazor

.NET Core - 为啥我应该使用视图组件而不是集成在 MVC 应用程序或 Razor 页面中的 Blazor 组件

在 Razor 页面中使用 Blazor @bind

Blazor 脚手架注册页面为啥 .cshtml 不是 .razor 文件?