2013-02-08 45 views
10

को JSON के बजाय शून्य मैं इस काम करने के लिए प्राप्त करने के लिए प्रतीत नहीं कर सकते हैं ... मैं ग्राहक पर इस तरह की कुछ jQuery है:jQuery पदों ASP.NET वेब एपीआई

$.ajax({ 
    type: "POST", 
    url: "api/report/reportexists/", 
    data: JSON.stringify({ "report":reportpath }), 
    success: function(exists) { 
     if (exists) { 
      fileExists = true; 
     } else { 
      fileExists = false; 
     } 
    } 
}); 

और मेरे वेब में।

[HttpPost] 
public bool ReportExists([FromBody]string report) 
{ 
    bool exists = File.Exists(report); 
    return exists; 
} 

मैं सिर्फ अगर किसी फ़ाइल सर्वर पर रहता है देखने के लिए जाँच कर रहा हूँ, और यह करता है या नहीं करने के लिए के रूप में एक bool वापस जाने के लिए: एपीआई नियंत्रक मैं इस तरह एक विधि है। रिपोर्ट स्ट्रिंग जो मैं भेज रहा हूं वह एक यूएनसी पथ है, इसलिए रिपोर्टपैथ '\\ कुछ \ path \' जैसा दिखता है।

मैं स्क्रिप्ट को ठीक से आग लगा सकता हूं, और मेरी ReportExists विधि में ब्रेकपॉइंट हिट कर सकता हूं, लेकिन रिपोर्ट चर हमेशा शून्य है।

मैं क्या गलत कर रहा हूं?

मुझे। पोस्ट और पोस्टजेसन के साथ पोस्ट करने का एक तरीका भी दिखाई देता है। शायद मुझे उनमें से एक का उपयोग करना चाहिए? यदि हां, तो मेरा प्रारूप क्या होगा?

अद्यतन: एक अतिरिक्त सुराग शायद- अगर मैं [FromBody] को हटा देता हूं तो मेरा ब्रेकपॉइंट बिल्कुल हिट नहीं होता- 'कोई http संसाधन नहीं मिला जो अनुरोध से मेल खाता है'। उदाहरण मैं देख रहा हूं कि [FromBody] की आवश्यकता नहीं है ...?

+1

'$ .ajax' इस स्थिति के लिए अधिक उपयुक्त होगा क्योंकि आपको 'कंटेंट टाइप:" एप्लिकेशन/जेसन "' $ .ajax' –

+0

के विकल्प के रूप में भी शामिल करने की आवश्यकता हो सकती है त्रुटियों के लिए अपना मॉडलस्टेट जांचना सुनिश्चित करें बाध्यकारी मानकों के दौरान कुछ गलत होने पर। –

उत्तर

23

तो मैं समस्या है, और समाधान मिल गया। तो, पहली बात पहले। कंटेंट टाइप 'एप्लिकेशन/जेसन' नहीं हो सकता है, इसे खाली होना चाहिए (आवेदन/एक्स-www-form-urlencoded मैं डिफ़ॉल्ट मानता हूं)। हालांकि ऐसा लगता है कि आपको जेसन भेजना है, लेकिन नाम मूल्य जोड़ी में नाम के बिना। JSON.stringify का उपयोग करके यह भी गड़बड़ हो जाता है। तो पूरा काम कर jQuery कोड इस तरह है:

$.ajax({ 
    type: "POST", 
    url: "api/slideid/reportexists", 
    data: { "": reportpath }, 
    success: function(exists) { 
     if (exists) { 
      fileExists = true; 
     } else { 
      fileExists = false; 
     } 
    } 
}); 

Web.API ओर, आप चाहिए [FromBody] पैरामीटर पर attibute है, लेकिन इस के अलावा अन्य यह बहुत मानक है। असली समस्या (मेरे लिए) पोस्ट था।

फ़िडलर में, अनुरोध शरीर इस "=% 5C% 5Croot% 5Cdata% 5Creport.html"

This पोस्ट की तरह दिखाई देता वास्तव में इस सवाल का जवाब था, और this लेख जो भी काफी मददगार था से जुड़ा हुआ।

+0

अच्छा लिंक, धन्यवाद :) –

+0

+1000 अगर मैं कर सकता था। एकमात्र पोस्ट जो पूरी तरह से मेरी समस्या को ठीक करता है। –

+0

हां, यह तब काम करता है जब आपके पास एक साधारण डेटा प्रकार होता है और डीटीओ या मॉडल का उपयोग नहीं करता है। आखिरकार मैंने सब कुछ छोड़ दिया जो सिद्धांत में काम करना चाहिए था और बस इसे इस जवाब की तरह किया और यह काम करता है। – JohnWrensby

10

jQuery.ajax() डिफ़ॉल्ट रूप से सामग्री सेट करें application/x-www-form-urlencoded होने के लिए टाइप करें। आप इसके बजाय application/json में अनुरोध भेज सकते हैं। इसके अलावा, आप एक स्ट्रिंग के रूप में अपने डेटा भेजने चाहिए और यह अपनी पोस्ट विधि के लिए report पैरामीटर के लिए मॉडल बाँध मिल जाएगा:

$.ajax({ 
    type: "POST", 
    url: "api/report/reportexists/", 
    contentType: "application/json", 
    data: JSON.stringify(reportpath), 
    success: function(exists) { 
     if (exists) { 
      fileExists = true; 
     } else { 
      fileExists = false; 
     } 
    } 
}); 
+1

हां, सामग्री प्रकार अक्सर समस्या है। –

6

यह मेरे लिए काम किया है, अन्य सभी दृष्टिकोण नहीं था:

function addProduct() { 
     var product = { 'Id': 12, 'Name': 'Maya', 'Category': 'newcat', 'Price': 1234 };    
     $.ajax({ 
      type: "POST", 
      url: "../api/products", 
      async: true, 
      cache: false, 
      type: 'POST', 
      data: product, 
      dataType: "json", 
      success: function (result) { 

      }, 
      error: function (jqXHR, exception) { 
       alert(exception); 
      } 
     }); 
    } 

serverside:

[HttpPost] 
    public Product[] AddNewProduct([FromBody]Product prod) 
    { 
     new List<Product>(products).Add(prod); 
     return products; 
    } 
+1

मैं सादा JSON ऑब्जेक्ट को ओवरहेन्ड करता हूं, कोई स्ट्रिंग आवश्यक नहीं है! –

+0

धन्यवाद, वास्तव में धन्यवाद, कई खोजों के अंत में यह मेरे लिए काम किया! –

0

$ .post मेरे लिए उद्देश्य की सेवा। वेबपी से [FromBody] निकालें और jquery क्लाइंट में $ .post के url पैरामीटर में url दें। इसने काम कर दिया!

0

यदि आप एमवीसी के FromBody विशेषता का उपयोग कर रहे हैं, तो एमवीसी बाइंडर इसे वैकल्पिक पैरामीटर के रूप में मानता है। इसका मतलब है कि आपको पैरामीटर नामों के बारे में स्पष्ट होना चाहिए, भले ही आपको केवल FromBody पैरामीटर प्राप्त हो।

आप इस के रूप में सरल कुछ के साथ काम करने के लिए सक्षम होना चाहिए:

नियंत्रक:

[HttpPost] 
public bool ReportExists([FromBody]string report) 
{ 
    bool exists = File.Exists(report); 
    return exists; 
} 

जावास्क्रिप्ट:

$.ajax({ 
    type: "POST", 
    url: "api/report/reportexists/", 
    data: { "report":reportpath }, 
    success: function(exists) { 
    ... 

आपको सुनिश्चित करना होगा अपने डेटा कि jQuery में ऑब्जेक्ट आपके Contr के पैरामीटर नाम से मेल खाता है ollers बिल्कुल