2013-01-11 13 views
5

मेरे ajax कॉल इसलगातार MVC नियंत्रक से jQuery ajax पोस्ट पर 400 (ख़राब अनुरोध) प्राप्त करने

$.ajax({ //actually approve or reject the promotion 
       url: url, 
       type: "POST", 
       data: '{'+data.PromotionId+','+data.UserId+','+data.ReasonText+'}', 
       dataType: "json", 
       //contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        if (indicator == 'A') { 
         alert('Promotion approved successfully!'); 
        } 
        else { 
         alert('Promotion rejected successfully.'); 
        } 

        var homelink = '<%: Url.Action("Index","Home") %>'; 
        window.location.href = (homelink); 


        returndata = data; 
       }, 
       error: function (xhRequest, ErrorText, thrownError) { 
        alert("Failed to process promotion correctly, please try again"); 
        console.log('xhRequest: ' + xhRequest + "\n"); 
        console.log('ErrorText: ' + ErrorText + "\n"); 
        console.log('thrownError: ' + thrownError + "\n"); 
       } 
      }); 

तरह लग रहा है और मेरे MVC नियंत्रक इस तरह दिखता है:

[HttpPost] 
    public HttpResponseMessage ApprovePromotion(PromotionDecision decision) 
    { 
     if (ModelState.IsValid && decision != null) 
     { 
      bool status = PromotionBo.ApprovePromotion(decision); 
      if (status == true) 
       return new HttpResponseMessage(HttpStatusCode.OK); 
     } 
     return new HttpResponseMessage(HttpStatusCode.BadRequest); 
    } 

मैं वाक्य रचना सोचा था इन दोनों पर सही था हालांकि हर बार जब मैं AJAX कॉल करता हूं तो मुझे 400 प्रतिक्रिया मिलती है। क्या है कि मैं गलत कर रहा हूँ?

उत्तर

10

आप सर्वर पर पूरी तरह से टूटी हुई और अवैध JSON स्ट्रिंग भेज रहे हैं। यह सामान्य है कि नियंत्रक कार्रवाई इसे अस्वीकार करती है। इसके अलावा आपने टिप्पणियों को contentType पैरामीटर में डाल दिया है जिसमें यह निर्दिष्ट किया गया है कि आप एक JSON अनुरोध भेजना चाहते हैं।

तो यहाँ अनुरोध करने के लिए सही तरीका है:

$.ajax({ //actually approve or reject the promotion 
    url: url, 
    type: "POST", 
    data: JSON.stringify({ 
     // Those property names must match the property names of your PromotionDecision view model 
     promotionId: data.PromotionId, 
     userId: data.UserId, 
     reasonText: data.ReasonText 
    }), 
    contentType: "application/json; charset=utf-8", 
    success: function (data) { 
     if (indicator == 'A') { 
      alert('Promotion approved successfully!'); 
     } 
     else { 
      alert('Promotion rejected successfully.'); 
     } 

     var homelink = '<%: Url.Action("Index","Home") %>'; 
     window.location.href = (homelink); 

     returndata = data; 
    }, 
    error: function (xhRequest, ErrorText, thrownError) { 
     alert("Failed to process promotion correctly, please try again"); 
     console.log('xhRequest: ' + xhRequest + "\n"); 
     console.log('ErrorText: ' + ErrorText + "\n"); 
     console.log('thrownError: ' + thrownError + "\n"); 
    } 
}); 

सूचना कैसे मैं JSON.stringify विधि जाता है कि मूल रूप से निर्मित में आधुनिक ब्राउज़रों का उपयोग कर रहा यह सुनिश्चित करें कि JSON सर्वर के लिए भेजा जा रहा है सही ढंग से और सभी मान ठीक से एन्कोड किए गए हैं। और यदि आपको पत्थर युग से ब्राउज़र का समर्थन करने की आवश्यकता है, तो आप json2.js स्क्रिप्ट को अपने पृष्ठ पर शामिल कर सकते हैं जो JSON.stringify विधि को परिभाषित करेगा।

महत्वपूर्ण टिप्पणी: बिल्कुल नहीं स्ट्रिंग concatenations का उपयोग कर JSON तारों का निर्माण अपने कोड के रूप में।

वैकल्पिक रूप से, अगर आप एक JSON भेजने के लिए नहीं करना चाहते हैं अनुरोध कर आप एक मानक application/x-www-form-urlencoded अनुरोध भेज सकते हैं:

$.ajax({ //actually approve or reject the promotion 
    url: url, 
    type: "POST", 
    data: { 
     promotionId: data.PromotionId, 
     userId: data.UserId, 
     reasonText: data.ReasonText 
    }, 
    success: function (data) { 
     if (indicator == 'A') { 
      alert('Promotion approved successfully!'); 
     } 
     else { 
      alert('Promotion rejected successfully.'); 
     } 

     var homelink = '<%: Url.Action("Index","Home") %>'; 
     window.location.href = (homelink); 

     returndata = data; 
    }, 
    error: function (xhRequest, ErrorText, thrownError) { 
     alert("Failed to process promotion correctly, please try again"); 
     console.log('xhRequest: ' + xhRequest + "\n"); 
     console.log('ErrorText: ' + ErrorText + "\n"); 
     console.log('thrownError: ' + thrownError + "\n"); 
    } 
}); 

यह उसी तरह और नियंत्रक कार्रवाई ठीक से मॉडल बाध्य करने के लिए सक्षम होना चाहिए काम करना चाहिए।

टिप्पणी: मैंने देखा है कि आपने अपनी सफलता कॉलबैक में निम्न पंक्ति का उपयोग किया: returndata = data;। इससे मुझे विश्वास होता है कि आप किसी भी तरह सफलता कॉलबैक के बाहर एक एसिंक्रोनस AJAX अनुरोध के परिणाम का उपभोग करने का प्रयास कर रहे हैं जो संभव नहीं है। मुझे नहीं पता कि आप इस returndata चर के साथ क्या कर रहे हैं लेकिन मुझे लगता है कि यह गलत है।

+0

हाँ मुझे लगा कि यह किसी भी तरह टूटा हुआ था और ऊपर दिया गया कोड यह है कि आप इसके बाद दो सीधी घंटों तक काम कर रहे हैं और तेजी से निराश हो गए हैं। मैं इसे एक बार दूंगा और जब यह काम करता है तो इसे उत्तर के रूप में चिह्नित करें। – Pseudonym

+0

यह आपके सहायक और सूचनात्मक उत्तर के लिए धन्यवाद, पूरी तरह से काम किया। – Pseudonym

+0

महान उत्तर ... – Mark

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