9

我的网页上的货币字段出现错误(“字段金额必须是数字”)。这是因为美元符号($50.00)。

[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:c}", ApplyFormatInEditMode = true)]
public decimal Amount { get; set; }

@Html.EditorFor(model => model.Amount)

如果我想保留美元符号,我还需要做什么?

4

3 回答 3

8

默认 MVC 模型绑定器无法解析格式化为 display 的值。因此,您应该编写自己的模型绑定器并将其注册为该类型(假设类型名称为 Foo):

public class FooModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider.GetValue("Amount");

        if (result != null)
        {
            decimal amount;
            if (Decimal.TryParse(result.AttemptedValue, NumberStyles.Currency, null, out amount))                
                return new Foo { Amount = amount };                                

            bindingContext.ModelState.AddModelError("Amount", "Wrong amount format");                
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

在 Application_Start 处为 Foo 类型添加此活页夹:

ModelBinders.Binders.Add(typeof(Foo), new FooModelBinder());

啊,最后一件事 -data-val-number从金额文本框中删除属性(否则您将继续看到它不是数字的消息):

$("#Amount").removeAttr("data-val-number");

现在,如果输入值不是正确的货币金额(例如$10F.0),您将收到验证错误消息。


顺便说一句,我认为使用它ApplyFormatInEditMode = false比实现所有这些东西来帮助 MVC 绑定您的自定义格式化字符串更好。

于 2013-01-22T21:37:28.093 回答
0

您还可以将编辑模式设置为 false。然后它将仅显示十进制值,而文本将被格式化。

ApplyFormatInEditMode = false
于 2014-05-08T20:40:00.073 回答
0

您可以使用 System.ComponentModel.DataAnnotations.RegularExpressionAttribute。

于 2013-01-25T22:23:15.857 回答