ASP.NET MVC 4货币字段

Zdr*_*nev 8 asp.net-mvc asp.net-mvc-4

我在货币字段的网页上收到错误("字段金额必须是数字").这是因为美元符号($ 50.00).

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

@Html.EditorFor(model => model.Amount)
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*kiy 7

默认MVC模型绑定器无法解析为显示格式化的值.因此,您应该编写自己的模型绑定器并为此类型注册它(假设类型名称为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在Application_Start中为Foo类型添加此绑定器:

ModelBinders.Binders.Add(typeof(Foo), new FooModelBinder());
Run Code Online (Sandbox Code Playgroud)

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

$("#Amount").removeAttr("data-val-number");
Run Code Online (Sandbox Code Playgroud)

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


BTW我认为使用ApplyFormatInEditMode = false比实现所有这些东西更好,以帮助MVC绑定您的自定义格式化字符串.