2010-01-26 20 views
10

मैं एएसपी.NET एमवीसी में अपने नियंत्रकों को पोस्ट करते समय मानक क्वेरीरीटिंग के विपरीत जेएसओएन भेजने में सक्षम होना चाहता हूं। मेरे पास फ़्रंट-एंड सामान ठीक काम कर रहा है (इमारत और फिर मेरे JSON ऑब्जेक्ट्स सबमिट कर रहा है)।एएसपी.नेट एमवीसी: नियंत्रक को JSON भेजना

समस्या नियंत्रक पक्ष पर है जहां एमवीसी ढांचे के साथ जहाज वाले डिफ़ॉल्ट मॉडलबिंडर्स इसका समर्थन नहीं करते हैं।

मैं इस के आसपास तरीके का एक संयोजन देखा है, उनमें से एक एक फिल्टर जो एक पैरामीटर के रूप वस्तु लेता है लागू करने के लिए है, यह डी-serialise करने के लिए एक JSON पुस्तकालय का उपयोग करता है, और है कि कहते हैं कार्रवाई मानकों करने के लिए। यह आदर्श नहीं है।

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

क्या किसी और को इसका सामना करना पड़ा है? एक विचार यह था कि अगर मैं एमवीसी फॉर्मकोलेक्शन से कैसे निपटता हूं और वहां पर रोक लगाता हूं, तो मैं बस ओवरराइड कर सकता हूं, संग्रह को मूल्य जोड़ रहा हूं और उम्मीद कर रहा हूं कि एमवीसी बाकी के सामान्य फैशन में बाकी कर सकता है। क्या किसी को पता है कि यह संभव है?

मुख्य समस्या, मुझे लगता है कि, मेरी समस्या बाध्यकारी नहीं है क्योंकि मेरे दृश्य मॉडल इससे पहले कि वे कहां से अलग नहीं हैं। समस्या JSON पोस्ट से मान प्राप्त कर रही है।

यदि मैं सही एमवीसी हूं तो QueryString से मान प्राप्त करें और इसे फॉर्म संग्रह में डाल दें जिसका उपयोग मॉडलबाइंडिंग के लिए किया जाता है। तो फॉर्मकोलेक्शन को असाइन करने के तरीके को बदलने का सही तरीका नहीं होना चाहिए? एक कार्रवाई के

उदाहरण:

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails) 
{ 
//etc 
} 

सामान्य बाध्यकारी काम करता है, JSON भी नहीं और मॉडल बाइंडर के सभी उदाहरण काम नहीं करेगा करता है। मेरा सबसे अच्छा समाधान अब तक ऑब्जेक्ट को एक शब्दकोश और लूप में परिवर्तित करना है, हालांकि प्रत्येक परम और इसे मेल खाता है। आदर्श प्रतीत नहीं होता है।

+0

यदि आप इसे वोट देने जा रहे हैं तो क्या आप समझा सकते हैं? – Damien

+0

क्षमा करें, दुर्भाग्य से, जब मैं पसंदीदा स्टार पर क्लिक करने के लिए गया, तो मैंने गलती से डाउन वोट पर क्लिक किया, यहां तक ​​कि मैंने इसे पहले से ही ऊपर उठाया था (यही कारण है कि यह 5 से 3 तक चला गया)। और अब मैंने गलती से जो किया है उसे पूर्ववत करने की कोशिश करने के तुरंत बाद कहा, कि जब तक सवाल संपादित नहीं हो जाता, तब तक मेरा वोट बदलने में बहुत देर हो गई। यदि आप इस सवाल को संपादित करते हैं तो मैं खुशी से अपना वोट ठीक कर दूंगा। – jamesaharvey

+0

कोई समस्या नहीं! यह मेरे साथ भी कई बार होता है। – Damien

उत्तर

8

मैं इस तरह json के लिए एक कस्टम मॉडल बांधने की मशीन का उपयोग करें:

public class JsonModelBinder<T> : IModelBinder { 
    private string key; 

    public JsonModelBinder(string requestKey) { 
     this.key = requestKey; 
    } 

    public object BindModel(ControllerContext controllerContext, ...) { 
     var json = controllerContext.HttpContext.Request[key]; 
     return new JsonSerializer().Deserialize<T>(json); 
    } 
} 

और फिर इस तरह Global.asax.cs में इसे तार:

ModelBinders.Binders.Add(
    typeof(Product), 
    new JsonModelBinder<Product>("ProductJson")); 

आप यहाँ इस बारे में और अधिक पढ़ सकते हैं : Inheritance is Evil: The Epic Fail of the DataAnnotationsModelBinder

संपादित

JsonModelBinder का उपयोग केवल उत्पाद के रूप में टाइप किए गए नियंत्रक क्रिया पैरामीटर पर किया जाना चाहिए। Int32 और ClassObject को डिफ़ॉल्ट मॉडेल बाइंडर पर वापस आना चाहिए। क्या आप एक अलग परिणाम का अनुभव कर रहे हैं?

+0

तो आपको यह परिभाषित करने की आवश्यकता होगी कि किस प्रकार के लिए इसका उपयोग करना है? – Damien

+0

हां, आपको प्रकार निर्दिष्ट करना होगा। क्या आप अपनी स्थिति का थोड़ा और विस्तार से वर्णन कर सकते हैं? मैं हाल ही में मॉडल बाध्यकारी में खुदाई कर रहा हूं और इसमें बहुत सारी गैर-स्पष्ट कार्यक्षमता है। –

+0

अच्छी तरह से प्रकार के साथ मैं क्रिया पैरामीटर के बारे में क्या करता हूं जो आदिम प्रकार/डंक हैं? अगर मैं इंट 32 आईडी भेज रहा हूं, कक्षा उत्पाद यह समस्या पैदा करता है – Damien

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