如何验证货币字段?

Ing*_*mar 5 razor ef-code-first asp.net-mvc-4

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

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

这是我认为的相应部分:

    @Html.EditorFor(model => model.Price)
    @Html.ValidationMessageFor(model => model.Price)
Run Code Online (Sandbox Code Playgroud)

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

100,00€

这很好.

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

如果(1)我删除了€符号并且(2)替换了小数分隔符(用点替换逗号),我只能解决这个问题.

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

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

谢谢你的帮助,伙计们!

Ing*_*mar 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*"));
Run Code Online (Sandbox Code Playgroud)

在_Layout.cshtml中:

@Scripts.Render("~/bundles/scripts/globalization")
Run Code Online (Sandbox Code Playgroud)

并在_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]);
        }
Run Code Online (Sandbox Code Playgroud)

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

[DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)]
Run Code Online (Sandbox Code Playgroud)

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