mvc textboxfor使用十进制输入掩码

时间:2014-10-17 18:59:20

标签: asp.net asp.net-mvc asp.net-mvc-4

我们正在使用MVC,我想看看是否有另一种更好的方法来处理这个问题。我们目前在模型中声明了一个名为AmountOfContract的十进制字段:

    [DisplayName("Amount Of Contract")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
    public decimal AmountOfContract { get; set; }

使用以下内容显示在页面上

                @Html.LabelFor(model => model.AmountOfContract, new { @class = "control-label col-md-2" })
            <div class="col-md-4">
                <div class="input-group m-b">
                    <span class="input-group-addon">$</span>
                    @Html.TextBoxFor(model => model.AmountOfContract, new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.AmountOfContract)
                </div>
            </div>

这很好用。后来我们的用户要求我们有文本框show,(逗号),所以不要输入10000.00,而是显示逗号填写,以便键入10,000.00

我们使用autoNumeric.js应用了输入掩码。应用了掩码但是如果我们提交了值为10,000.00的表单,则Model.IsValid wold总是返回false,并将model.AmountOfContract设置为0.这是因为逗号被强制进入十进制字段而不是有效的。

我们解决这个问题的方法是创建另一个字段

    [DisplayName("Amount Of Contract")]
    public string StrAmountOfContract { get; set; }

然后在表单上使用它,因此用户发送和接收字符串,然后使Model.IsValid返回true。但是在保存到db之前,我们需要将StrAmountOfContract分配回AmountOfContract。

有更好的方法吗?由于我们有一些形式,我们必须以类似的方式改变。

1 个答案:

答案 0 :(得分:1)

使用逗号

十进制不接受的值也可以在字符串中重现值并转换它! 您可以使用正则表达式来验证它的价格:

[DisplayName("Amount Of Contract")]
[RegularExpression(@"^(((\d{1,3})(,\d{3})*)|(\d+))(.\d+)?$",ErrorMessage="The Value format must be 00.00 or 00,00")]
public string AmountOfContract { get; set; }

请参阅Patterns

您的操作中的

可以从字符串转换为十进制:

if(ModelState.IsValid)
{
    decimal price = Convert.ToDecimal(model.Price.Replace(',','.').ToString());
}

请参阅Model Binding Decimal Values