Domyślny segregator modelu MVC cannot parse value formatted for display. Tak więc, należy napisać własną spoiwo modelu i zarejestrować go do tego typu (załóżmy nazwa typu jest 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);
}
}
Dodaj spoiwo dla typu Foo na Application_Start:
ModelBinders.Binders.Add(typeof(Foo), new FooModelBinder());
Ach, i ostatni sprawa - usunąć atrybut data-val-number
od wysokości pola tekstowego (w przeciwnym razie będzie nadal widząc komunikat, że nie jest to liczba):
$("#Amount").removeAttr("data-val-number");
teraz dostaniesz sprawdzania błędów Wiadom e jeśli wartość wejściowa nie będzie poprawną kwotą waluty (np. $10F.0
).
BTW myślę, że lepiej jest użyć ApplyFormatInEditMode = false
niż realizować wszystkie te rzeczy, które pomogą MVC związać swoją niestandardową sformatowany ciąg.
może zależeć od aktualnej kultury –