2013-01-18 15 views
7

Otrzymuję błąd ("Pole Kwota musi być liczbą") na mojej stronie internetowej w polu waluty. To ze względu na znak dolara (50,00 dolarów).ASP.NET MVC 4 pole waluty

[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:c}", ApplyFormatInEditMode = true)] 
public decimal Amount { get; set; } 

@Html.EditorFor(model => model.Amount) 

Co jeszcze muszę zrobić, jeśli chcę zachować znak dolara?

+0

może zależeć od aktualnej kultury –

Odpowiedz

7

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.

0

Można użyć System.ComponentModel.DataAnnotations.RegularExpressionAttribute.

0

Można również ustawić tryb edycji na false. Następnie wyświetli tylko wartość dziesiętną, a tekst zostanie sformatowany.

ApplyFormatInEditMode = false