如何绑定可为空的十进制值

Posted

技术标签:

【中文标题】如何绑定可为空的十进制值【英文标题】:How to bind nullable decimal values 【发布时间】:2016-09-04 17:52:25 【问题描述】:

我在使用 ASP.NET Core MVC 和 decimal? 值时遇到问题。

我有以下视图模型:

 public class BlobViewModel
 
    public int Id  get; set; 
    public int? IntegerValue  get; set; 
    public string StringValue  get; set; 
    [DataType(DataType.Date)]
    public DateTime? DateValue  get; set; 
    public decimal? DecimalValue  get; set; 
 

以及我认为的以下输入元素

<input asp-for="DecimalValue" class="form-control" />

当我输入一个十进制值时,例如“68.5”或“68,5”并从输入元素中跳出,我收到以下错误:

值“68.5”对于 DecimalValue 无效。

我已尝试使用属性上方的[DataType(DataType.Currency)] 属性,但我似乎无法让绑定工作。其他属性按预期绑定。

有没有人知道我是如何做到这一点的?

【问题讨论】:

我无法在基本的 .Net Core (RTM) 项目中重现这一点。 有一个由 ASP.NET Core 提供的全球化解决方案。需要在 Startup.cs 中的 ConfigureServices 和 Configure 方法中添加一些设置查看此文档:docs.microsoft.com/en-us/aspnet/core/fundamentals/… 【参考方案1】:

如果您的本地 Windows 设置未设置为美国本地化,并且您使用默认的 asp.net 模板 jquery 验证来验证十进制值,则会出现错误。无论您的小数是否为nullable,都应该发生错误

ASP.NET Core 中,我认为您不能在web.config 中强制本地化到美国,就像您在this 答案中一样,您可以在ASP.NET MVC5 和更早版本中使用相同的方式,所以您必须添加 javascript 以覆盖 jquery.validate.js 作为同一问题的答案。

创建一个名为validationlocalizationjs 文件并将其放入您的wwwroot\js 文件夹中,其中包含以下内容

$.validator.methods.range = function (value, element, param) 
    var globalizedValue = value.replace(",", ".");
    return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);


$.validator.methods.number = function (value, element) 
    return this.optional(element) || /^-?(?:\d+|\d1,3(?:[\s\.,]\d3)+)(?:[\.,]\d+)?$/.test(value);

在需要十进制验证的cshtml 页面中,将javascript 文件的引用添加到您的脚本部分。确保在引用现有 _ValidationScriptsPartial. 之后添加它

@section Scripts 

     ...

     <script src="~/js/validationlocalization.js"></script>

More detail 关于此解决方法

【讨论】:

谢谢一百万。这正是我们所需要的:-)

以上是关于如何绑定可为空的十进制值的主要内容,如果未能解决你的问题,请参考以下文章

C# winforms:将可空类型绑定到其他属性(不是文本)时出错

如何将 CheckBox 绑定到可为空的布尔类型 DbColumn?

堆栈溢出错误可为空的数字类型c#

为啥 TargetNullValue 更新可为空的 Source

可为空的 DateTime 的 Datepicker 绑定不正确

如何从大量可为空的布尔值中返回布尔值?