ASP.NET MVC 4 currency field

后端 未结 3 1131
迷失自我
迷失自我 2021-02-14 21:23

I get an error (\"The field Amount must be a number\") on my web page on a currency field. It is because of the dollar sign ($50.00).

[DataType(DataType.Currency         


        
3条回答
  •  星月不相逢
    2021-02-14 21:41

    Default MVC model binder cannot parse value formatted for display. So, you should write your own model binder and register it for this type (suppose type name is 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);
        }
    }
    

    Add this binder for Foo type at Application_Start:

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

    Ah, and last thing - remove data-val-number attribute from amount textbox (otherwise you will continue seeing message that it's not a number):

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

    Now you will get validation error message if input value will not be correct currency amount (e.g. $10F.0).


    BTW I think it's better to use ApplyFormatInEditMode = false than implement all this stuff to help MVC bind your custom formatted string.

提交回复
热议问题