2011-04-18 9 views
46

किसी कारण से, बाँध नहीं है जब मैं एक कार्रवाई करने के लिए इस JSON भेजें:डिफ़ॉल्ट ASP.NET MVC 3 मॉडल बांधने की मशीन दशमलव गुण

{"BaseLoanAmount": 5000} 

जो एक दशमलव संपत्ति के साथ एक मॉडल के लिए बाध्य होने के लिए माना जाता है "BaseLoanAmount" नाम है, यह बाँध नहीं है, यह सिर्फ 0. रहता है लेकिन अगर मैं भेजें:

{"BaseLoanAmount": 5000.00} 

यह संपत्ति के लिए बाध्य करता है, लेकिन क्यों? 5000 को दशमलव ईवेंट में परिवर्तित नहीं किया जा सकता है यदि उसके पास दशमलव संख्या नहीं है?

उत्तर

71

asp.net MVC के के स्रोत कोड में कदम के बाद, यह seemsd समस्या रूपांतरण asp.net MVC के लिए ढांचे के प्रकार कनवर्टर, का उपयोग करता है जो किसी कारण से दशमलव रूपांतरण के लिए एक पूर्णांक के लिए झूठी देता है, मैं एक कस्टम मॉडल बांधने की मशीन प्रदाता और दशमलव के लिए मॉडल बांधने की मशीन का उपयोग कर समाप्त हो गया है, आप इसे यहाँ देख सकते हैं:

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 
} 

इस ModelBinder रजिस्टर करने के लिए, बस Application_Start() अंदर निम्न पंक्ति डाल:

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

'वापसी' में बूलियन अभिव्यक्ति कथन 'valueProviderResult == null' सत्य का मूल्यांकन नहीं कर सकता है, क्योंकि इससे पहले 'valueProviderResult.AttemptedValue' एक शून्य-अपवाद अपवाद फेंक देगा। – Diego

+2

नोट: फिल हैक यह भी सिफारिश करता है, http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx –

+2

मैं वास्तव में इस समस्या के लिए आपके मूल समाधान का उपयोग कर रहा हूं - धन्यवाद! एक मुद्दा: दशमलव के लिए नियत nulls? फ़ील्ड को इसके बजाय शून्य असाइन किया जाता है। मैं अंततः टाइप के डिफ़ॉल्ट मान को असाइन करना है या नहीं, यह निर्धारित करने के लिए 'valueProviderResult.RawValue == null' की जांच के साथ चला गया। – Matt

12

इस तरह यह भेजने का प्रयास करें:

{ "BaseLoanAmount": "5000" } 
+2

मैं जेएसओएन तैयार करने के लिए JSON.stringify का उपयोग करता हूं, क्या इसके लिए सर्वर साइड समाधान है? मैं क्लाइंट कोड के साथ गड़बड़ नहीं करना चाहता क्योंकि यह एएसपी.नेट एमवीसी है जो अपना काम सही नहीं कर रहा है। – ryudice

+2

@ एरुडिस, मुझे डर है कि कैसे जावास्क्रिप्ट सीरिएलाइज़र संख्यात्मक प्रारूपों से संबंधित है। जब आप निरर्थक दशमलव, फ्लोट्स, का उपयोग करना शुरू करते हैं, तो चीजें भी गड़बड़ हो सकती हैं ... आपको कई विसंगतियां मिलेंगी। जेएसओएन विनिर्देश उद्धरण के अनुसार वैसे भी हमेशा इस्तेमाल किया जाना चाहिए, इसलिए मुझे पूरा यकीन नहीं है कि कौन अपना काम सही तरीके से नहीं कर रहा है। इसलिए आपको क्लाइंट पक्ष पर इसे स्ट्रिंग करने से पहले संख्यात्मक मान को स्ट्रिंग में परिवर्तित करने की आवश्यकता हो सकती है। –

+0

मुझे अभी पता चला है कि अगर मैं संपत्ति प्रकार को डबल करने के लिए बदलता हूं तो ठीक है, क्या आपको पता है कि समस्या मूल्य प्रदाता या मॉडल बाइंडर में हो सकती है या नहीं? और क्या आपको पता है कि कोई वैल्यू प्रदाता है जो फ्रेमवर्क जावास्क्रिप्ट deserializer के बजाय JSON.net का उपयोग करता है? – ryudice

संबंधित मुद्दे