2012-08-02 13 views
8

मेरे पास कुछ डेटा "फू" है जो मैं ब्राउज़र से सर्वर पर पास करना चाहता हूं और foo के भीतर मौजूद जानकारी के आधार पर अनुमानित आंकड़े पुनर्प्राप्त करना चाहता हूं।क्लाइंट से सर्वर पर जटिल मॉडल कैसे पास करें?

$.ajax({ 
     type: 'GET', 
     url: "/api/predictedStats/", 
     data: "foo=" + ko.toJSON(foo, fooProperties), 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     success: function(data) { 
     return _this.viewModel.setPredictedStats(data); 
     }, 
     error: function(jqXHR, statusText, errorText) { 
     return _this.viewModel.setErrorValues(jqXHR, errorText); 
     } 
    }); 

मैंने भविष्यवाणी आंकड़े नियंत्रक बनाया और विधि को Foo का तर्क लेने के लिए विधि प्राप्त की।

public class PredictedStatsController : ApiController 
{ 
    public PredictedStats Get(Foo foo) 
    { 
     return statsService.GetPredictedStats(foo); 
    } 
} 

प्राप्त विधि पर एक ब्रेकपाइंट चिपका मैं देख रहा हूँ फू वस्तु हमेशा रिक्त है। वेबपी ट्रेस लॉगिंग से केवल निम्नलिखित पंक्तियों में फेंकने वाली कोई त्रुटि नहीं है।

WEBAPI: opr[FormatterParameterBinding] opn[ExecuteBindingAsync] msg[Binding parameter 'foo'] status[0] 
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Type='foo', content-type='application/json; charset=utf-8'] status[0] 
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Value read='null'] status[0] 

मैं सर्वर पर फू वस्तु बनाने के लिए तो मैं json बनाया clientside साथ कुछ भी गलत नहीं है कह सकते हैं फू नियंत्रक के लिए एक पोस्ट के माध्यम से डेटा भेजने में कोई समस्या नहीं है।

परिणामस्वरूप फिडलर में देख रहे हैं परिणाम प्राप्त करें जैसे jsondata ऑब्जेक्ट foo है।

GET /api/predictedStats?foo={jsondata} HTTP/1.1 

क्या यह भी संभव है या मैं इस सब गलत के बारे में जा रहा हूं?

धन्यवाद नील


संपादित करें: मुझे लगता है कि मैं लगभग इस निम्नलिखित

public PredictedStats Get([FromUri]Foo foo) 
{ 
    return statsService.GetPredictedStats(foo); 
} 

वस्तु foo वापस ठीक आ रहा था के साथ काम कर लेकिन फू का कोई गुण आबादी वाले जा रहे थे मिल गया अच्छी तरह।


मतलब समय मैं पास समान डेटा बस छोड़ने के साथ एक पोस्ट का उपयोग कर का सहारा लिया गया है में "foo =" और यह सिर्फ ठीक काम कर रहा है।

मुझे यकीन नहीं है कि इस मामले में POST या GET का उपयोग किया जाना चाहिए, लेकिन यह जानना दिलचस्प होगा।


मैं भी इस http://bugs.jquery.com/ticket/8961 जो सुझाव देने के लिए आप jQuery के साथ एक GET अनुरोध में एक शरीर अनुलग्न नहीं कर सकते तो पोस्ट शायद ही समझदार विकल्प

उत्तर

6

आपने लगभग मिला :)

है लगता है पाया

जब आप [FromUri] (जिसे आपको 'जटिल' ऑब्जेक्ट्स के लिए उपयोग करना है, क्योंकि डिफ़ॉल्ट वेब एपीआई जटिल वस्तुओं को 'बाध्य' नहीं करता है, तो यह हमेशा उन्हें शरीर से deserialize करना चाहता है) आपको param= पास करने की आवश्यकता नहीं है उरी - आप केवल क्वेरी स्ट्रिंग पैरामीटर के रूप में मान के सदस्यों को पास करते हैं। यह 'member1=value&member2=value' है - जहां member1 और member2Foo के सदस्य हैं।

ध्यान दें कि jQuery में कोई 'बग' नहीं है - जबकि HTTP spec अनुरोध निकाय को प्रतिबंधित नहीं करता है, यह संभावना है कि ब्राउज़र करता है (और यदि ऐसा है, तो jQuery इसे भेज नहीं सकता है), और यह है संभावना से अधिक है कि एक सर्वर इसे कभी भी नहीं पढ़ेगा। यह सिर्फ स्वीकार नहीं किया अभ्यास है। इसमें संभावित रूप से कैशिंग के साथ भी दिलचस्प समस्याएं हैं, साथ ही, ब्राउज़र में कोई पोस्ट, पुट, डिलीट आदि नहीं होगा, लेकिन अगर प्रतिक्रिया शीर्षलेख इसे प्रतिबंधित नहीं करते हैं तो एक जीईटी कैश करेगा - जिसके लिए गंभीर साइड इफेक्ट्स हो सकते हैं एक ग्राहक आवेदन।मैं आपको इस विषय पर अधिक जानकारी और कुछ उपयोगी लिंक के लिए इस SO: HTTP GET with request body को देखने की सलाह देता हूं।

समान रूप से, jQuery का उपयोग करते समय - आपको ऑब्जेक्ट को JSON में कनवर्ट करने की आवश्यकता नहीं है - बस data विकल्पों में सदस्य जावास्क्रिप्ट ऑब्जेक्ट को पास करें और jQuery इसे सही प्रारूप में बदल देता है।

या ऐसा होना चाहिए, वेब एपीआई उस प्रारूप को समझता है जो jQuery ने इसे पास किया है।

+1

धन्यवाद, मैं अपने सिर को खरोंच कर रहा था क्यों एक 'जटिल वस्तु' पैरामीटर पॉप्युलेट नहीं किया गया था, हालांकि मैंने इसे '[FromUri]' से सजाया था। मैंने जेसन में पास करने की कोशिश की ? param = {नाम: Foo} जो काम नहीं करता था, मुझे इसे बदलना पड़ा था? नाम = फू जैसा आपने कहा था। ध्यान दें कि यदि आपके पास एकाधिक '[FromUri]' जटिल ऑब्जेक्ट पैरामीटर हैं, तो आपको यह सुनिश्चित करना होगा कि उनके पास समान नाम वाले गुण न हों - या आप दोनों उदाहरणों को आवंटित वही संपत्ति मान के साथ समाप्त हो जाएंगे। –

+2

कृपया ध्यान दें कि एक साधारण 'सार्वजनिक स्ट्रिंग सदस्य 1;' काम नहीं करेगा और 'सदस्य 1' अभी भी' शून्य 'होगा। उन्हें ** गुण ** में बदलें और यह ठीक काम करेगा। – Thomas

+0

उनके बारे में संपत्ति होने के बारे में ... मैंने 4 घंटे पहले यह क्यों नहीं पढ़ा। बेवकूफ महसूस करने के बारे में बात करें, धन्यवाद थॉमस इस सरल के लिए अभी तक ओह बहुत सही टिप्पणी। –

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