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
You can use System.ComponentModel.DataAnnotations.RegularExpressionAttribute.
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.
You can also set edit mode to false. Then it will only show the decimal value while text will be formatted.
ApplyFormatInEditMode = false