2013-07-10 6 views
8

के साथ जटिल ऑब्जेक्ट को बांधें, मैं एक GET अनुरोध में एक एमवीसी एक्शन विधि में uri में नेस्टेड सरणी के साथ एक जटिल ऑब्जेक्ट भेजना चाहता हूं।[FromUri] विशेषता का उपयोग करना - नेस्टेड सरणी

पर विचार करें निम्नलिखित कोड:

public ActionResult AutoCompleteHandler([FromUri]PartsQuery partsQuery){ ... } 

public class PartsQuery 
{ 
    public Part[] Parts {get; set; } 
    public string LastKey { get; set; } 
    public string Term { get; set; } 
} 

$.ajax({ 
    url: "Controller/AutoCompleteHandler", 
    data: $.param({           
         Parts: [{ hasLabel: "label", hasType: "type", hasIndex : 1 }], 
         LastKey : "Last Key", 
         Term : "Term"        
        }), 
    dataType: "json", 
    success: function(jsonData) { ... } 
}); 

यह सिर्फ ठीक काम करता है और सही ढंग से MVC वेब एपीआई में डिफ़ॉल्ट मॉडल बांधने की मशीन का उपयोग कर बांधता है।

हालांकि, नीचे सादा MVC नहीं WebAPI और डिफ़ॉल्ट मॉडल बांधने की मशीन टूट जाता है करने के लिए इस स्विच और नेस्टेड सरणी में वस्तुओं पर गुण बाध्य नहीं कर सकते हैं:

दृश्य सूची

partsQuery  != null   //Good 
--LastKey  == "Last Key" //Good 
--Term   == "Term"  //Good 
--Parts[]  != null   //Good 
----hasLabel == null   //Failed to bind 
----hasType  == null   //Failed to bind 
----hasIndex == 0    //Failed to bind 

मैं चाहूँगा यह जानने के लिए कि यह सादा एमवीसी में क्यों टूट जाता है और FromUriAttribute कैसे इस वस्तु को सादा एमवीसी

+0

क्या होता है यदि आप 'भाग [] पार्ट्स' को 'आईसीओलेक्शन पार्ट्स' में बदलते हैं तो क्या होता है? और क्या आप 'भाग' के लिए कक्षा परिभाषा दिखा सकते हैं? –

+0

अब कोशिश कर रहा है। भाग सार्वजनिक के साथ सरल पीओसीओ है {प्राप्त करें; सेट; } props – parliament

+0

क्या 'भाग' में पैरामीटर रहित कन्स्ट्रक्टर है? –

उत्तर

9

कोर समस्या यहां है कि एमवीसी और वेबएपी विभिन्न मॉडल बी का उपयोग करते हैं inders। यहां तक ​​कि बेस इंटरफेस भी अलग हैं।

Mvc - System.Web.Mvc.IModelBinder 
Web API - System.Web.Http.ModelBinding.IModelBinder 

जब आप अपने $ .ajax कॉल के साथ डेटा भेजने के लिए, आपको निम्न क्वेरी स्ट्रिंग पैरामीटर भेज रहे हैं:

Parts[0][hasLabel]:label 
Parts[0][hasType]:type 
Parts[0][hasIndex]:1 
LastKey:Last Key 
Term:Term 

है, उचित प्रारूप कि MVC डिफ़ॉल्ट मॉडल बांधने की मशीन के साथ बाँध होगा के लिए अलग अलग नामकरण परंपरा है पैरामीटर नाम:

Parts[0].hasLabel:label 
Parts[0].hasType:type 
Parts[0].hasIndex:1 
LastKey:Last Key 
Term:Term 

तो, यह विधि कॉल काम करेगा:

$.ajax({ 
      url: "Controller/AutoCompleteHandler?Parts[0].hasLabel=label&Parts[0].hasType=type&Parts[0].hasIndex=1&LastKey=Last+Key&Term=Term", 
      dataType: "json", 
      success: function(jsonData) { ... } 
     }); 

आपको एमवीसी मॉडल बाइंडर नामकरण सम्मेलनों का सम्मान करने के लिए अपनी क्वेरी स्ट्रिंग बनाने की आवश्यकता है।

इसके अतिरिक्त [FromUri] आपकी उदाहरण कार्रवाई में विशेषता पूरी तरह से अनदेखा की जाती है, क्योंकि यह एमवीसी डिफॉल्टमोडेल बाइंडर के लिए ज्ञात नहीं है।

+0

प्रतिक्रिया के लिए धन्यवाद लेकिन मुझे पहले से ही इतना पता था। 2 संभावित समाधान क्लाइंट पक्ष पर सही सम्मेलन में यूआरएल स्ट्रिंग को मजबूर करना होगा, मेरा प्रश्न यहां: http://stackoverflow.com/questions/17580471/javascript-regex-to-coerce-url-string-returned-from -param-in-mvc-model-bindi, या डिफ़ॉल्ट $ .param() सम्मेलन को संभालने के लिए एक कस्टम मॉडल बाइंडर बनाएं, मेरा प्रश्न यहां: http://stackoverflow.com/q/17558735/1267778 .. लेकिन मैं ' मैं सबसे अच्छा समाधान सोच रहा हूं कि एमवीसी समर्थन से उरुरी का समर्थन हो सकता है, यह सवाल यही है। अगर कोई इसका उत्तर नहीं दे सकता है तो मैं आपके उत्तर को – parliament

+0

चिह्नित करूंगा रेगेक्स एक पर्याप्त साफ समाधान है, इसलिए मैं आपको उत्तर के रूप में चिह्नित करूंगा क्योंकि यह फिर भी मूल्यवान है।लेकिन अगर कोई वास्तव में एमवीसी में सेयूरी काम करने के तरीके के वास्तविक सवाल का जवाब दे सकता है तो मैं उसे चिह्नित करूंगा। धन्यवाद – parliament

+1

मुझे लगता है कि एमवीसी नियंत्रक में वेब एपीआई बाध्यकारी काम करना बहुत बड़ा प्रयास होगा। पाइपलाइन पूरी तरह से अलग हैं और वेब एपीआई बाइंडिंग का आह्वान करने के लिए आपको निचले स्तर के वेब-एपीआई विशिष्ट ऑब्जेक्ट्स (एचटीपी कंट्रोलर डिस्क्रिप्टर, एचटीपीएक्शन डिस्क्रिप्टर, मॉडल बाइंडिंग कॉन्टेक्स्ट इत्यादि) के ठीक से गुच्छा को तुरंत चालू करना होगा। – Nenad

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