7

Projemde, kullanıcıların 2 farklı biçimde çift değerleri girmesine izin vermek istiyorum: ',' veya '.' sınırlayıcı olarak (üstel formla ilgilenmiyorum). Varsayılan değer olarak sınırlayıcı ile '.' çalışma Bu davranış, karmaşık model nesnelerdeki tüm çift özellikler için çalışmasını istiyorum (şu anda tanımlayıcıları ve değerleri içeren nesnelerin koleksiyonlarıyla çalışıyorum).Çift değerlerle ilgili sorun Sorun

Ne kullanmalıyım: Değer Sağlayıcılar veya Model Bağlayıcılar? Lütfen sorunumu çözme kodunu göster.

+2

http://stackoverflow.com/questions/5050641/asp-net-mvc- model-binder-with-global-number-formatları hiç yardımcı olur mu? – iwayneo

cevap

17

Bir özel modeli cilt kullanabilirsiniz:

public class DoubleModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (result != null && !string.IsNullOrEmpty(result.AttemptedValue)) 
     { 
      if (bindingContext.ModelType == typeof(double)) 
      { 
       double temp; 
       var attempted = result.AttemptedValue.Replace(",", "."); 
       if (double.TryParse(
        attempted, 
        NumberStyles.Number, 
        CultureInfo.InvariantCulture, 
        out temp) 
       ) 
       { 
        return temp; 
       } 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Application_Start tescil edilebilir:

ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
+0

Açık bir cevap için teşekkürler, ama Değer Sağlayıcıların amacı nedir? Farklı kaynaklara göre soyutlama (form değeri toplama, url parametreleri, sunucu değişkenleri, çerezler vb.)? –

+0

Plus, Nullable türü için aynı bağlayıcıyı eklemeyi unutmayın – vasilyk