我们正在使用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。
有更好的方法吗?由于我们有一些形式,我们必须以类似的方式改变。
答案 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());
}