【问题标题】:Product Price returns fasle for is Modelstate Valid产品价格返回 fasle 为 Modelstate Valid
【发布时间】:2016-07-29 08:32:37
【问题描述】:

我有一个如下所示

class Product{
  public string ProductName {get;set;}
  public decimal ProductPrice {get;set;}

}

View中,我指的是顶部的model

并使用Lamba expression 创建输入

 @Html.TextBoxFor(n => n.Transaction.ProductName )
 @Html.TextBoxFor(n => n.Transaction.ProductPrice )

这一切都有效,现在当我在产品价格中输入1.11 时它可以正常工作

但如果我输入类似240,000ModelState is not valid

这是为什么呢?这样做的正确方法是什么?如何创建仅处理价格的文本框?没有文字输入?

【问题讨论】:

  • 因为逗号,逗号不是有效的数值
  • 好吧 1.11 和 1,11 不同,不知道这是否会影响您的代码,但也许可以尝试一下
  • @J.Steen 是的,他/她可以在使用 javascript 提交表单之前预先格式化这些值。我不确定这是否是理想的方式

标签: c#


【解决方案1】:

尝试为十进制数据类型实现自定义模型绑定器,它将根据您当前的文化解析十进制值:

public class PriceModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = value };

        decimal result = 0.0M;
        if (!decimal.TryParse(value.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture, out result))
            modelState.Errors.Add(new FormatException("Price is not valid"));

        return result;
    }
}

【讨论】:

  • 是的。使用IModelBinder 是正确的方法。 +1
【解决方案2】:

尝试将 ,(comma) 更改为 .(dot)

在 c# 中,它使用 .(dot) 表示十进制值(不是类型,实际十进制值)
而是使用字符串格式将您的值从 2016000.5 转换为 2 016 000,5 或 2,016,000.5(如果这是您要查找的内容)

【讨论】:

    【解决方案3】:

    看起来您的问题可能是“240,000”中的逗号。你有两个选择:

    (a) 将文本框限制为仅限数字字符

    @Html.TextBoxFor(n => n.TransactionProductPrice, new { type = "number" })
    

    (b) 将 ProductPrice 的类型更改为字符串,然后在控制器端用逗号将千位分隔为小数来解析字符串(请参阅其他 question 以获得帮助)

    var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands);
    var price = Decimal.Parse(viewmodel.TransactionProductPrice, allowedStyles);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      相关资源
      最近更新 更多