2011-04-18 17 views
46

, bağlamaz ben bir eyleme bu JSON gönderirken:Standart ASP.NET MVC 3 modeli bağlayıcı ondalık özelliklerini Nedense

{"BaseLoanAmount": 5000} 

ondalık özelliğe sahip bir modele bağlı olması gerekiyordu "BaseLoanAmount" adlı, bunun sadece 0'a kalır ama gönderirseniz bağlamaz:

{"BaseLoanAmount": 5000.00} 
o özelliği bağlamak gelmez

, ama neden? Ondalık sayı yoksa 5000, ondalık bir olaya dönüştürülemez mi?

cevap

71

asp.net MVC kaynak koduna adım sonra, sorun dönüşüm asp.net mvc için çerçevenin tip dönüştürücü kullanır olmasıdır seemsd nedense hangi onlu dönüşümü int için false döndürür, ben ondalık için özel modeli cilt sağlayıcı ve model bağlayıcı kullanılarak sona erdi, buradan görebilirsiniz:

public class DecimalModelBinder : DefaultModelBinder 
{ 
    #region Implementation of IModelBinder 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (valueProviderResult.AttemptedValue.Equals("N.aN") || 
      valueProviderResult.AttemptedValue.Equals("NaN") || 
      valueProviderResult.AttemptedValue.Equals("Infini.ty") || 
      valueProviderResult.AttemptedValue.Equals("Infinity") || 
      string.IsNullOrEmpty(valueProviderResult.AttemptedValue)) 
      return 0m; 

     return Convert.ToDecimal(valueProviderResult.AttemptedValue); 
    }  

    #endregion 
} 

bu ModelBinder kaydetmek için, sadece Application_Start() içine aşağıdaki satırı koyun:

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

'return' ifadesinde Boole ifadesi "valueProviderResult == null" ifadesi, "valueProviderResult.AttemptedValue" ifadesinden önce, null-ref istisnası atar. – Diego

+2

not: Phil Haack bunu da tavsiye ediyor, http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx –

+2

Tam olarak bu sorun için orijinal çözümünü kullanıyorum - teşekkürler! Bir sorun: ondalık için nulls? yerine sıfır alanları atanır. Sonunda, türün varsayılan değerini ataıp atamayacağımı belirlemek için 'valueProviderResult.RawValue == null' kontrolünü yaptım. – Matt

12

böyle göndermeden deneyin:

{ "BaseLoanAmount": "5000" } 
+2

JSON'u hazırlamak için JSON.stringify kullanıyorum, bunun için bir sunucu tarafı çözümü var mı? İşini doğru yapmıyor ASP.NET MVC beri müşteri kodu ile uğraşmak zorunda istemiyorum. – ryudice

+2

@ryudice, korkarım ki sayısal formatlarla javascript serializer işte böyle. Nükülebilen ondalık sayıları, şamandıraları kullanmaya başladığınızda işler daha da dağınık olabilir ... Birçok tutarsızlık bulacaksınız. Her durumda JSON şartname tırnaklarına göre her zaman kullanılmalıdır, bu yüzden kimin işini doğru yapmadığını tam olarak bilmiyorum. Bu nedenle, sayısal değeri, istemci tarafında dizilemeden önce bir dizeye dönüştürmeniz gerekebilir. –

+0

Özellik çiftini ikiye katladığımda, bağlantıyı değiştirirseniz, sorunun değer sağlayıcıda mı yoksa model bağlayıcıda mı olabileceğini biliyor muydunuz? ve çerçeveler javascript deserializer yerine JSON.net kullanan bir değer sağlayıcı varsa biliyor musunuz? – ryudice