【问题标题】:How can I validate a currency field?如何验证货币字段?
【发布时间】:2013-07-17 19:00:27
【问题描述】:

我有一个带有这个货币字段的 ASP.NET MVC-4 应用程序:

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)]
    [DataType(DataType.Currency)]
    public decimal? Price { get; set; }

这是我认为的对应部分:

    @Html.EditorFor(model => model.Price)
    @Html.ValidationMessageFor(model => model.Price)

如果价格是 100 欧元,视图中的文本字段会显示:

100,00 欧元

这很好。

但我一尝试回发就遇到了问题。验证器弹出并说价格字段需要是一个数字。

只有在 (1) 删除 € 符号并 (2) 替换小数点分隔符(用点替换逗号)时,我才能解决此问题。

如果没有更好的解决方案,我想我可以更改 DataFormatString = "{0:F2}" 以避免货币符号。

但是如何让验证器接受逗号作为小数分隔符而不是(美式)点?

谢谢你们的帮助,伙计们!

【问题讨论】:

  • 我认为你需要做一个自定义模型活页夹检查这个链接haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
  • @Overmachine:感谢您的评论。但我认为 ModelBinder 不会解决验证器问题。换句话说:我仍然想要客户端验证 - 验证器仍然会失败(有或没有 ModelBinder),我错了吗?
  • 客户端验证仍然有效,问题是当您回帖时,它正在发送货币符号。
  • 你好。 “客户端验证仍然有效”是什么意思?当然它会起作用,但验证的结果将是负面的——即使我删除了货币符号。至少那是我的测试运行中发生的事情。无论如何,我能够通过使用来自github.com/jquery/globalize 的东西来解决我的问题。感谢您的帮助,Overmachine!

标签: asp.net-mvc-4 razor ef-code-first


【解决方案1】:

所以,我能够使用来自 http://github.com/jquery/globalize 的 jQuery 的全球化插件解决我的问题。

我将以下文件添加到我的 /scripts 文件夹:

  • /scripts/globalize.js
  • /scripts/cultures/globalize.cultures.js
  • /sctipts/cultures/globalize.culture.de-DE.js

BundleConfig.cs 中:

bundles.Add(new ScriptBundle("~/bundles/scripts/globalization").Include(
          "~/Scripts/globalize*",
          "~/Scripts/cultures/globalize*"));

_Layout.cshtml中:

@Scripts.Render("~/bundles/scripts/globalization")

_Layout.cshtml的脚本部分:

$.validator.methods.number = function (value, element) {
            return this.optional(element) || !isNaN(Globalize.parseFloat(value));
        }
        $.validator.methods.range = function (value, element, param) {
            return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]);
        }

但是,我无法使货币符号与客户端验证一起使用,因此我还更改了数据注释,如下所示:

[DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)]

但就是这样。无需进行其他更改。我现在可以输入“1,49”或“18,77”之类的值,所有内容都会正确存储在我的数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多