2012-06-22 20 views
5

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

पोस्ट विधि के लिए बाध्य करने में विफलता पैरामीटर क्यों हैं, और मैं इसे कैसे ठीक कर सकता हूं?

send: function(evt) { 
    evt.preventDefault(); 
    $.ajax({ 
     url: '/api/person', 
     data: this.model.toJSON(), 
     type: "POST", 
     dataType: "json", 
     success: function(data) { 
      console.log("Success"); 
     }, 
     error: function(data) { 
      console.log("Error"); 
     } 
    }); 
    } 

निम्नलिखित नियंत्रक क्रियाएँ है:

public void Get(string name, string email) { 
    throw new NotImplementedException(); 
} 

public void Post(string name, string email) { 
    throw new NotImplementedException(); 
} 

नोट्स:

  • मैं ASP.NET MVC 4 आर सी वेब एपीआई के लिए डिफ़ॉल्ट (तो deserializer के सभी उपयोग कर रहा हूँ Json.NET होना चाहिए)
  • जेएस डीबगर पर क्रोम नेटवर्क टैब सही ढंग से पोस्ट डेटा में पैरामीटर दिखाता है।

उत्तर

13

एमवीसी (वेब ​​पेज) के विपरीत, सरल पैरामीटर will not, by default, bind from the post body but instead from the URI टाइप करते हैं। तो, आपके कोड के साथ-साथ आपको क्वेरी स्ट्रिंग या रूट पैरामीटर के रूप में name और email पैरामीटर पारित करने होंगे।

हालांकि इसे आसानी से मॉडल प्रकार (एमवीसी स्थानीय भाषा में) बनाकर और विधि पैरामीटर के लिए इसका उपयोग करके हल किया जा सकता है। वास्तव में आप तो, दोनों के लिए उपयोग कर सकते हैं (जैसा भी मामला है कि आपके द्वारा दिए गए में) यदि आप तो प्राप्त पद्धति पर [FromUri] का उपयोग करें:

public class SomeParams { 
    public string name { get; set; } 
    public string email { get; set; } 
} 

//now an alternative way to write the Get method 
public MyResult Get([FromUri] SomeParams p){ 
    //members are bound from the query string (more like MVC traditional binding) 
    //note - as in MVC, SomeParams will need a default constructor for this to work. 
} 

public PostResult Post(SomeParams p){ 
    //'p' is bound from your JSON (assuming correct format) 
    //because 'complex' types are deserialized using formatters 
    //only one object can be read from the body with a formatter in Web API 
    //as the request body is not buffered; unlike MVC. 
} 

मैं तरीकों सिर्फ इसलिए के लिए बदले प्रकार में फंस गए हैं उन्हें कुछ वापस करने की ज़रूरत होगी!

मैं वास्तव में माइक स्टाल के लेख के माध्यम से पढ़ने की अनुशंसा करता हूं जिसे मैं ऊपर से जोड़ता हूं (और उसके कई अन्य)।

यह मानना ​​प्रतीत होता है कि वेब एपीआई, क्योंकि यह समान प्रतिमानों और यहां तक ​​कि एमवीसी के वर्ग नाम साझा करता है, वास्तव में एमवीसी जैसा ही है - लेकिन ऐसा नहीं है। मैंने शुरुआत में आश्चर्यचकित किया कि यह मामला क्यों था (जैसा कि मैंने स्वयं एमवीसी के शीर्ष पर बहुत सी आरईएसटी सेवाएं लिखी हैं और कुछ यूटिलिटी क्लासेस और बेस-क्लास एन्हांसमेंट्स लिखने के बाद, यह बहुत अच्छी तरह से शांत हो गई है), लेकिन उन्होंने वेब एपीआई लिखने की चुनौतियों पर एक उचित नजर डाली है और मुझे लगता है कि उनके पास दृष्टिकोण में परिवर्तन करने का शायद सही अधिकार है।

हालांकि, इसका मतलब यह है कि हमें कुछ चीजें लेनी पड़ती हैं जिन्हें हम अब स्वीकार कर सकते हैं और उन्हें वेब एपीआई के लिए फिर से सीख सकते हैं।

+0

मेरा प्राप्त पैरामीटर शून्य नहीं है, वास्तव में यह भी अस्तित्व में नहीं है। मैं स्पष्ट नहीं हो सकता था लेकिन यह केवल यह बताने के लिए है कि कार्यक्षमता जीईटी पर काम करती है और पोस्ट पर नहीं होती है। – Cody

+1

ठीक है - ठीक है, तो यह ठीक है :)। संक्षेप में, हालांकि, यदि आप अनुरोध के शरीर से कई पैरामीटर बाध्य कर रहे हैं, तो मूल रूप से सबसे आसान काम यह है कि मैंने दिखाया है कि एक साधारण मॉडल प्रकार लिखना है। –

+0

माइक स्टाल लेख लिंक के लिए धन्यवाद, यह क्या हो रहा है के बारे में बहुत जानकारीपूर्ण था। मैंने अभी माना था कि वेब एपीआई ने एमवीसी के समान सटीक बाध्यकारी रणनीति का उपयोग किया था। परम प्राप्त करने के लिए एक कस्टम क्लास बनाना एक आकर्षण की तरह काम करता है, मैं उस समाधान का प्रशंसक नहीं हूं लेकिन मुझे पता नहीं लगा कि क्यों, इसलिए मैं शायद जिद्दी हूं। :) किसी भी मामले में यह समाधान है जिसका मैं उपयोग करूंगा। धन्यवाद!:) – Cody

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