2012-10-12 8 views
6

मैं उन के लिए एक आवश्यकता है एक का नेतृत्व के लिए उद्धरण की एक सूची को संपादित करने का एक संग्रह से पोस्ट किया, उद्धरण हो सकता है विभिन्न प्रकार जैसे:उपवर्गों

  • QuoteForProductTypeA
  • QuoteForProductTypeB

सभी उद्धरण प्रकार एक सामान्य बेस क्लास साझा करते हैं, जैसे कोटटेबेस।

मेरे पास मेरे उद्धरण सामने वाले छोर पर ठीक दिख रहे हैं, और सही डेटा को भी पोस्ट करने के लिए दिखाई देते हैं।

हालांकि, सर्वर पर यह स्पष्ट रूप से नहीं जानता कि कौन सा सबक्लास उपयोग करना है, इसलिए बस बेस क्लास का उपयोग करता है।

मुझे लगता है कि मुझे वेबएपी के लिए किसी प्रकार के कस्टम मॉडल बाइंडर की आवश्यकता है ताकि मॉडलटाइप जैसे छुपे हुए क्षेत्र की जांच हो, जिसमें संग्रह में ऑब्जेक्ट का प्रकार शामिल है, तो मॉडल बाइंडर फिर इस प्रकार का एक नया ऑब्जेक्ट बनाता है और बाध्य करता है मेरे पोस्ट किए गए मानों से इस ऑब्जेक्ट में गुण।

हालांकि, मैं इस बिंदु पर बहुत कम दस्तावेज़ीकरण/ब्लॉग के साथ इस पर कैसे अटक गया हूं कि यह कैसे करें।

मैंने वेबएपीआई के लिए स्रोत कोड की जांच की है यह देखने के लिए कि क्या मैं एक डिफ़ॉल्ट मॉडल बाइंडर का विस्तार कर सकता हूं, लेकिन कोई भी डिफ़ॉल्ट वर्गों को सील कर दिया गया है।

मैं केवल इसे देखकर IModelBinder को कार्यान्वित कर सकता हूं, मैं मॉडल टाइप नामक मान की तलाश करके सही मॉडल प्रकार बना सकता हूं, लेकिन फिर मुझे यकीन नहीं है कि मेरे सबक्लास में शेष मूल्यों को कैसे भरें, अगर वहां से एक डिफ़ॉल्ट मॉडल बांधने वाला था जिसे मैं विरासत में मिला था, मैं बस बेस क्लास बाइंड विधि को कॉल करता हूं।

उत्तर

9

यदि आपका पोस्ट संग्रह अनुरोध निकाय से आता है, तो यह मॉडल बाइंडर के माध्यम से नहीं जाएगा। वेब एपीआई सामग्री को deserialize करने के लिए फॉर्मेटर का उपयोग करेगा।

यदि आप सिर्फ जेसन का समर्थन करना चाहते हैं, तो यह काफी आसान है। बस अपने वेब एपीआई config के लिए निम्न कोड जोड़ें:

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 

सेटिंग json.net पेलोड में टाइप नाम को बचाने के लिए अगर क्रम प्रकार की घोषणा प्रकार के साथ अलग है करने देगा। जब आप इसे वापस पोस्ट करते हैं, तो json.net पेलोड में निर्दिष्ट प्रकार के पेलोड को deserialize करेगा।

एक नमूना पेलोड लगता है:

{"$type":"MvcApplication2.Models.Car, MvcApplication2","SeatCount":10,"WheelCount":4,"Model":0,"Brand":null}] 
+0

धन्यवाद, कि चाल किया। मैं अपने मॉडल को जेसन से इस कोड के साथ उपभोग करने के लिए जेसन में क्रमबद्ध कर रहा था: एचटीएमएल.रॉ (जेसन.एन्कोड (मॉडल)), हालांकि मुझे इसके बजाय जेसन.Net धारावाहिक का उपयोग करने के लिए इस कोड को स्वैप करना था, और टाइपनाम नामकरण विकल्प निर्दिष्ट करना था भी ... अगर अन्य लोग जवाब की तलाश में हैं। –

+1

यदि यह किसी और के लिए उपयोगी है - '$ type' ऑब्जेक्ट में सूचीबद्ध पहला फ़ील्ड होना चाहिए या JSON.Net इसे deserialize करने में सक्षम नहीं होगा। –

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

  • कोई संबंधित समस्या नहीं^_^