2009-05-11 17 views
10

मैं एएसपी.NET एमवीसी का उपयोग कर रहा हूं, लेकिन यह किसी भी ढांचे पर लागू होता है।jQuery AJAX और विभिन्न डेटा हैंडलिंग

मैं अपने सर्वर पर एक अजाक्स कॉल कर रहा हूं, जो ज्यादातर समय सादा पुराना HTML देता है, हालांकि अगर कोई त्रुटि है, तो मैं इसे एक स्टेटस संदेश के साथ JSON ऑब्जेक्ट वापस करना चाहता हूं (और कुछ अन्य बातें)। इस कुएं को संभालने के लिए jQuery कॉल में dataType विकल्प का कोई तरीका नहीं दिखता है। डिफ़ॉल्ट रूप से यह सबकुछ HTML के रूप में पार्स करने लगता है, जिससे <div>"{ status: 'error', message: 'something bad happened'}" के साथ पॉप्युलेट हो रहा है।

[संपादित करें] dataType ऑब्जेक्ट को अनदेखा करना और jQuery चित्र को बाहर निकालना या तो काम नहीं करता है। यह परिणाम के प्रकार को string के रूप में देखता है और इसे HTML के रूप में मानता है।

एक समाधान जो मैं आया था, परिणाम वस्तु को जेएसओएन के रूप में पार्स करने का प्रयास करना है। अगर यह काम करता है तो हम जानते हैं कि यह एक JSON ऑब्जेक्ट है। यह एक अपवाद फेंकता है, यह एचटीएमएल है:

$.ajax({ 
    data: {}, 
    success: function(data, textStatus) { 
     try { 
      var errorObj = JSON.parse(data); 
      handleError(errorObj); 
     } catch(ex) { 
      $('#results').html(data); 
     } 
    }, 
    dataType: 'html', // sometimes it is 'json' :-/ 
    url: '/home/AjaxTest', 
    type: 'POST' 
}); 

हालांकि, कि रास्ते में एक अपवाद का उपयोग कर के रूप में मुझे बहुत बुरा डिजाइन (और कम से कम कहने के लिए unintuitive) बनाता है। क्या कोई बेहतर तरीका है? मैंने एक JSON ऑब्जेक्ट में पूरी प्रतिक्रिया लपेटने के बारे में सोचा, लेकिन इस परिस्थिति में, मुझे नहीं लगता कि यह एक विकल्प है।

// ASP.NET MVC Action: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AjaxTest(int magic) { 
    try { 
     var someVal = GetValue(); 
     return PartialView("DataPage", someVal); 
    } catch (Exception ex) { 
     this.HttpContext.Response.StatusCode = 500; 
     return Json(new { status = "Error", message = ex.Message }); 
    } 
} 




// jQuery call: 

$.ajax({ 
    data: {}, 
    success: function(data, textStatus) { 
     $('#results').html(data); 
    }, 
    error: function() { 
     var errorObj = JSON.parse(XMLHttpRequest.responseText); 
     handleError(errorObj); 
    }, 
    dataType: 'html', 
    url: '/home/AjaxTest', 
    type: 'POST' 
}); 
+0

हममम, दिलचस्प स्थिति है, लेकिन मैं एक विधि होने अगर विभिन्न प्रकार वापसी पता नहीं है सबसे अच्छा विचार है - हो सकता है आप पहली विधि एक bool वापसी होनी चाहिए, और फिर $ .ajax कॉलबैक में आप कर सकते हैं एक और तरीका कॉल करें जो स्टेटस संदेश वापस कर देगा। –

उत्तर

9

अपनी जेएसओएन त्रुटियों के लिए आप 200 से अधिक सर्वर से 500 स्थिति कोड वापस कर सकते हैं। फिर jquery क्लाइंट कोड त्रुटि का उपयोग कर सकता है: त्रुटि प्रबंधन के लिए $ .ajax फ़ंक्शन पर हैंडलर। 500 प्रतिक्रिया पर आप प्रतिक्रिया प्रतिक्रिया से जेएसओएन त्रुटि ऑब्जेक्ट को पार्स कर सकते हैं, 200 प्रतिक्रिया पर आप अपने एचटीएमएल को सामान्य रूप से एक div में बंग कर सकते हैं।

+0

हू। महान विचार। –

+0

शानदार। मैं एक गंभीर विफलता के अलावा किसी अन्य चीज़ के लिए 500 का उपयोग करने की बहुत कम लीरी हूं, लेकिन मुझे लगता है कि यह अभी भी सबसे अच्छा विकल्प है। मैं कुछ कोड दिखाने के लिए पोस्ट संपादित करूंगा। – swilliams

+3

लौटने 400 (खराब अनुरोध) 500 से बेहतर हो सकता है ... –

6

जबकि स्टीव के विचार एक अच्छा एक है, मैं इस संपूर्णता के लिए में जोड़ रहा:

यहाँ समाधान है कि मैं स्टीव Willcock से मिल गया है।

ऐसा प्रतीत होता है कि यदि आप जेसन के डेटा टाइप निर्दिष्ट करते हैं लेकिन HTML वापस करते हैं, तो jQuery इसे ठीक से संभालता है।

if($_GET['type'] == 'json') { 
    header('Content-type: application/json'); 
    print '{"test":"hi"}'; 
    exit; 
} else { 
    header('Content-type: text/html'); 
    print '<html><body><b>Test</b></body></html>'; 
    exit; 
} 

$_GET['type'] सिर्फ इसलिए कि मैं क्या परीक्षण के दौरान वापस जाने के लिए नियंत्रित कर सकते हैं है:

मैं निम्नलिखित कोड के साथ इस सिद्धांत का परीक्षण किया। आपकी परिस्थिति में आप एक या दूसरे को वापस कर देंगे कि चीजें सही या गलत हो गई हैं या नहीं। कि विगत, इस jQuery कोड के साथ:

$.ajax({ 
    url: 'php.php?type=html', // return HTML in this test 
    dataType: 'json', 
    success: function(d) { 
     console.log(typeof d); // 'xml' 
    } 
}); 

हालांकि हम डेटाप्रकार के रूप में JSON निर्दिष्ट, jQuery (1.3.2) बाहर है कि इसकी नहीं है कि आंकड़े।

$.ajax({ 
    url: 'php.php?type=json', 
    dataType: 'json', 
    success: function(d) { 
     console.log(typeof d); // 'object' 
    } 
}); 

तो आप जो भी चाहते हैं उसे करने के लिए आप (जहां तक ​​मुझे पता है) अनौपचारिक व्यवहार का लाभ उठा सकते हैं।

+0

यह एएसपी.NET एमवीसी का एक कार्य हो सकता है, लेकिन टाइपफ डेटा एचटीएमएल और जेएसओएन दोनों परिणामों के लिए 'स्ट्रिंग' बता रहा है, इस प्रकार यह एचटीएमएल के रूप में संभालता है। – swilliams

+0

एमएम। एक क्षण। –

+0

एएसपी.नेट एमवीसी से प्राप्त होने वाली प्रतिक्रिया को एक त्रुटि के रूप में पार्स किया गया है। अगर मैं jQuery से त्रुटि() कॉलबैक को संभालता हूं तो मैं HTML प्राप्त कर सकता हूं ... जो काम करता है, लेकिन मेरे अपवाद हैंडलिंग कोड की तरह, "दाएं" प्रतीत नहीं होता है। अगर मैं PHP का उपयोग कर रहा था, तो यह निश्चित रूप से एक वैध समाधान होगा। – swilliams

3

लेकिन पोस्ट पर स्थिति (सफलता या त्रुटि) के बावजूद केवल JSON क्यों न लौटें और परिणाम प्रदर्शित करने के लिए जीईटी का उपयोग क्यों करें?
यदि आप मुझसे पूछें तो यह एक बेहतर दृष्टिकोण की तरह लगता है।

0

या आप हमेशा एक JSON प्रतिक्रिया वापस कर सकते हैं, और HTML सामग्री के रूप में एक पैरामीटर है।

कुछ की तरह:

{ 
    "success" : true, 
    "errormessage" : "", 
    "html" : "<div>blah</div>", 
} 

मुझे लगता है कि आप केवल एचटीएमएल मूल्य में दोहरे उद्धरण चिह्नों से बचने के लिए होगा, और JSON पार्सर पूर्ववत है कि आप के लिए।

+0

दुर्भाग्य से यह बेहद जटिल हो जाता है। – swilliams

0

मैं एमवीसी/अजाक्स/JQuery के साथ इस सटीक मुद्दे में भाग गया और एकाधिक डेटा टाइप (जेएसओएन और एचटीएमएल) का उपयोग करना चाहता हूं। मेरे पास डेटा वापस करने के लिए एक HTML डेटा टाइप का उपयोग करने के लिए AJAX अनुरोध है, लेकिन मैं AJAX अनुरोध से वापस आने वाले डेटा को JSON ऑब्जेक्ट में कनवर्ट करने का प्रयास करता हूं। मैं इस है कि मैं अपने सफलता कॉलबैक से फोन की तरह एक समारोह है:

_tryParseJson: function (data) { 
     var jsonObject; 

     try { 
      jsonObject = jQuery.parseJSON(data); 
     } 
     catch (err) { 
     } 

     return jsonObject; 
    } 

मैं तो मान लेते हैं कि अगर JSONObject और errorMessage संपत्ति मौजूद हैं, कि कोई त्रुटि हुई है, अन्यथा एक त्रुटि नहीं होती है।

0

मैंने केवल AJAX सफलता और त्रुटि कॉलबैक का उपयोग करके इसे पूरा किया। इस तरह से मैं सर्वर से मिश्रित तार और जेसन ऑब्जेक्ट प्रतिक्रिया प्राप्त कर सकता हूं।

नीचे मैं जेसन स्वीकार करने के लिए तैयार हूं, लेकिन अगर मुझे "पार्सररर" की स्थिति मिलती है (जिसका मतलब है कि jquery आने वाले कोड को जेसन के रूप में पार्स नहीं कर सका क्योंकि मैं उम्मीद कर रहा था), लेकिन इसकी अनुरोध स्थिति मिली "ठीक है" (200), तो मैं एक स्ट्रिंग के रूप में प्रतिक्रिया को संभालता हूं। "Parsererror" और "OK" के अलावा कोई भी चीज़, मैं एक त्रुटि के रूप में संभालता हूं।

$.ajax({ 
    dataType: 'json', 
    url: '/ajax/test', 
    success: function (resp) { 
     // your response json object, see if status was set to error 
     if (resp.status == 'error') { 
     // log the detail error for the dev, and show the user a fail 
     console.log(resp); 
     $('#results').html('error occurred'); 
     } 
     // you could handle other cases here 
     // or use a switch statement on the status value 
    }, 
    error: function(request, status, error) { 
     // if json parse error and a 200 response, we expect this is our string 
     if(status == "parsererror" && request.statusText == "OK") { 
     $('#results').html(request.responseText); 
     } else { 
     // again an error, but now more detailed and not a parser error 
     // and we'll log for dev and show the user a fail 
     console.log(status + ": " + error.message); 
     $('#results').html('error occurred'); 
     } 
    } 
    }); 
संबंधित मुद्दे