2011-08-09 8 views
8

Zajmuję się witryny w ASP.NET MVC 3.Parse dziesiętny w widoku modelu

nieruchomość

[DisplayName("Cost"), DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)] 
public decimal Cost { get; set; } 

View

@Html.EditorFor(x => x.Cost) 

Widok renderuje kosztować (1000,00 na przykład). Problem polega na tym, że sprawdzanie poprawności wymaga punktu zamiast przecinka. Jak mogę wyprowadzić 1000,00 zamiast 1000,00? Lub odwrócić walidację, aby zaakceptować przecinek zamiast punktu?

Edytuj. Ustawiłem globalizację w moim web.config na sv-SE (Szwecja).

Odpowiedz

10

musisz napisać niestandardowy model spoiwa, aby to zrobić.

/// <summary> 
/// http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx 
/// </summary> 
public class DecimalModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object actualValue = null; 
     try 
     { 
      actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
       CultureInfo.CurrentCulture); 
     } 
     catch (FormatException e) 
     { 
      modelState.Errors.Add(e); 
     } 

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return actualValue; 
    } 
} 

W pliku Global.asax dodać następujące metodę Application_Start

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
+0

Dzięki za snipet! Działa jak marzenie. Miałem problemy z wartościami podwójnymi w przeciwieństwie do liczb dziesiętnych i używałem atrybutu [DisplayFormat (ApplyFormatInEditMode = true, DataFormatString = "{0: #, 0}"), który formatowałby duble jako walutę bez wartości dziesiętnych. Czujesz się trochę głupio, że framework nie radzi sobie z nimi domyślnie. –

0

Nie można po prostu zmienić elementu DataFormatString, aby formatował liczbę za pomocą punktu, np. {0: 0,00} lub podobne?

+0

Formatowanie nie jest problemem, jest to, że walidacja zawiedzie – clyc

Powiązane problemy