产品价格返回fasle for Modelstate有效

时间:2016-07-29 08:32:38

标签: c#

我有 Class ,如下所示

Lamba expression

并在查看中,我引用顶部的模型

并使用 @Html.TextBoxFor(n => n.Transaction.ProductName ) @Html.TextBoxFor(n => n.Transaction.ProductPrice ) 创建输入

1.11

当我将240,000输入到产品价格中时,一切正常,

但如果我输入ModelState is not valid {{1}}

之类的内容

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

3 个答案:

答案 0 :(得分:1)

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

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;
    }
}

答案 1 :(得分:0)

看起来您的问题可能是“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);

答案 2 :(得分:0)

尝试将您的(逗号)更改为。(点)

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