2016-04-06 26 views
1

120,12 tarafından yok sayılır. ASP.NET MVC böyle şeyler işlemek gerektiğini okumak ama işe gelemediVirgül ondalık ayırıcı, ASP.NET MVC model binder

İstek:

Accept-Language:da,en;q=0.8,ru;q=0.6,en-US;q=0.4 
... 
Price: "120,12" 

Eylem yöntemi' modeli içerir:

var uICulture = Thread.CurrentThread.CurrentUICulture; // {da} 
var culture = Thread.CurrentThread.CurrentCulture; // {da-DK} 
: eyleme İçinde public double Price { get; set; }

Yerelleştirme, Application_AcquireRequestState:

içinde Global.asax'da denetlenir. 210
var cultureInfo = new CultureInfo("da"); 
Thread.CurrentThread.CurrentUICulture = cultureInfo; 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

Yardımlarınız için şimdiden teşekkür ederiz!

+0

'double.Parse (" 120,12 ", yeni System.Globalization.CultureInfo (" da "))', 120.12 değerini döndürür. Yerel ayarı "AcquireRequestState" ile kodlamak yerine, neyin yanlış olduğunu bulmaya çalışmalısınız - belki de web.config belirli bir kültürü kullanıyordur? Bakışta bir direktif var mı? Çeşitli ortamlarda bir yerel ayarı yapmaya çalışmak, genellikle daha fazla karışıklık ve hatayla sonuçlanır. –

+0

Yorumunuz için teşekkürler. Bu projede AcquireRequestState, kullanıcı seçimine göre yerel ayarı yapmak için kullanılır - sadece sabit kodlanmış da yerel olarak soru için basitleştirdim. –

cevap

0

Özel bir model ciltleyici yazabilirsiniz.

public class DecimalModelBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, 
      ModelBindingContext bindingContext) 
     { 
      var valueResult = bindingContext.ValueProvider 
       .GetValue(bindingContext.ModelName); 
      var modelState = new ModelState {Value = valueResult}; 
      object actualValue = null; 
      try 
      { 
       //Check if this is a nullable decimal and a null or empty string has been passed 
       var isNullableAndNull = (bindingContext.ModelMetadata.IsNullableValueType && 
              string.IsNullOrEmpty(valueResult.AttemptedValue)); 

       //If not nullable and null then we should try and parse the decimal 
       if (!isNullableAndNull) 
       { 
        actualValue = decimal.Parse(valueResult.AttemptedValue, NumberStyles.Any, CultureInfo.CurrentCulture); 
       } 
      } 
      catch (FormatException e) 
      { 
       modelState.Errors.Add(e); 
      } 

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

Tıpkı kullanıcı Decimal.Parse açıklamada seçtiği birinin buna CultureInfo.CurrentCulture değiştirin. Daha sonra yeni model oluşturucuyu başlangıçta kaydedin.

İlgili konular