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
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.