【问题标题】:Decimal value is not valid for price. MVC3十进制值对价格无效。 MVC3
【发布时间】:2014-03-02 09:56:28
【问题描述】:

Product.cs

...
    [Required(ErrorMessage="Price is required")]
    [Range(0.01, 100000.00,
        ErrorMessage="Price must be between 0.01 and 100000.00")]
    public decimal Price { get; set; }
...

当我输入“89.48”时,表单显示“值 '89.48' 对价格无效”。 我认为这是因为我的 PC 的默认语言。这不是英语。是俄语。

我尝试通过haacked.com 说明解决这个问题:

  1. 我创建了模型类 DecimalModelBinder 并将代码从 haacked.com 复制到类中
  2. 更新了 Global.asax
    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
    

    没有效果。然后我尝试通过client-side validation修复它 1.添加了名为“jQueryFixes.js”的JavaScript文件和代码

$.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+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}

这段代码没有解决这个问题。 你能建议我在这里做错了什么吗?

【问题讨论】:

    标签: c# javascript asp.net-mvc asp.net-mvc-3 validation


    【解决方案1】:

    我在 web.config 中设置

    <system.web>
        <globalization uiCulture="en-US" culture="en-US"/>
    <system.web>
    

    这个解决方案对我有用,我遇到了同样的错误

    【讨论】:

    • 我们还需要什么全球化??!!
    【解决方案2】:

    试试这个

        [Required(ErrorMessage = "Price is required")]
        [Range(typeof(decimal), "0.01", "100000.00", ErrorMessage = "enter decimal value")]
        [RegularExpression(@"^\[0-9]{1,6}\.[0-9]{2}$", ErrorMessage="enter decimal value of format $9.99")]
        public decimal Price { get; set; }
    

    应该有帮助。

    【讨论】:

      【解决方案3】:

      在你的 DecimalModelBinder 类中替换为这个。

      //if with period use InvariantCulture
      if (valueResult.AttemptedValue.Contains("."))
      {
          actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
          CultureInfo.InvariantCulture);
      }
      else
      {
          //if with comma use CurrentCulture
          actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
          CultureInfo.CurrentCulture);
      }
      

      解决方案来自这个link

      【讨论】:

        【解决方案4】:

        在 Global.asax 文件中使用以下代码解决了我的土耳其语问题

        protected void Application_BeginRequest()
        {
            var cultureInfo = new CultureInfo("tr-TR");
            cultureInfo.NumberFormat.NumberDecimalSeparator = ".";
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }
        

        【讨论】:

          【解决方案5】:

          试试这个:

          [Required(ErrorMessage = "Price is required")]
          [DataType(DataType.Currency)]
          public decimal Price { get; set; }    
          

          【讨论】:

          • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,那些人可能不知道您的代码建议的原因。From Review
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          • 1970-01-01
          • 2012-06-17
          • 2016-11-14
          • 2016-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多