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)]
[DisplayFormat(DataFormatString = "{0:c}", ApplyFormatInEditMode = true)]
public decimal Amount { get; set; }
@Html.EditorFor(model => model.Amount)
What else do I need to do if I want to keep the dollar sign?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With