2012-04-16 13 views
5

मेरे पास एक ऐसा फॉर्म है जो jQuery .ajax() POST के माध्यम से सर्वर पर सबमिट हो जाता है। यदि फ़ॉर्म सर्वर-साइड पर सत्यापन पास कर देता है, तो सर्वर क्लाइंट-एंड के लिए एचटीएमएल में परिणाम देगा जिसके अनुसार इसकी प्रस्तुति को तदनुसार अपडेट किया जाएगा। यदि, हालांकि, फॉर्म सत्यापन में विफल रहा है, तो सर्वर जेएसओएन में परिणाम देगा, जिसमें सत्यापन त्रुटियां शामिल हैं।

दोनों प्रकार के परिणाम .ajax() के हैंडलर में समाप्त हो जाएंगे। चूंकि दोनों प्रकार संभव हैं, हैंडलर को यह निर्धारित करने के लिए एक तरीका चाहिए कि परिणाम HTML या JSON है या नहीं। मैं उसे कैसे कर सकता हूँ?

नोट: सतह पर, मेरा प्रश्न this existing SO question जैसा दिखता है लेकिन वे समान नहीं हैं। उस प्रश्न में, केवल एक संभावित डेटाटाइप (HTML या JSON) है, जबकि मेरी समस्या दो संभावित डेटाटाइप (HTML और JSON) से निपटने का तरीका ढूंढने के बारे में है।

उत्तर

3

json डेटा के लिए, typeof(data)object हो जाएगा। एचटीएमएल डेटा के लिए यह string होगा।

कम से कम एएसपी.नेट एमवीसी 3 कार्यों से लौटाए गए डेटा के साथ यह काम करता है। मुझे लगता है कि यह माइम प्रकार है जो तय करता है कि कैसे लौटा हुआ डेटा वापस लौटाता है।

+0

मैंने पहले से ही कुछ बुनियादी अजाक्स कॉल के साथ इसका परीक्षण किया है, और ऐसा लगता है कि यह ठीक काम करता है। हालांकि आपने उत्तर पर 30 सेकंड तक मुझे हराया। – adeneo

5

आप dataType पैरामीटर खाली छोड़ देते हैं, jQuery MIME प्रकार के आधार पर यह तय करेंगे:

dataTypeString

डिफ़ॉल्ट: बुद्धिमान अनुमान (xml, json, स्क्रिप्ट, या एचटीएमएल)

उस डेटा का प्रकार जिसे आप सर्वर से वापस उम्मीद कर रहे हैं। किसी का भी उल्लेख किया गया है, jQuery प्रतिक्रिया के MIME प्रकार के आधार पर यह अनुमान लगाने के लिए कोशिश करेंगे

रेफरी: http://api.jquery.com/jQuery.ajax/

+0

मेरी समस्या यह है कि मेरे पास निष्पादित करने के लिए दो अलग-अलग कोड ब्लॉक हैं, डेटाटाइप के डेटाटाइप के आधार पर। 'सफलता' हैंडलर के पास 'कोड' ब्लॉक निष्पादित करने के लिए एक 'if' कथन है, लेकिन मैं' टी पता है कि 'if' कथन का उपयोग करने के लिए क्या उपयोग किया जा सकता है। – tamakisquare

+1

jQuery पहले से ही आपके लिए इसे पार्स कर देगा, इसलिए यह एक वैध जावास्क्रिप्ट ऑब्जेक्ट होगा यदि यह JSON था और स्ट्रिंग अगर यह HTML है। – Paystey

+1

@ahmoo: जैसा कि पेस्टी कहता है, आप यह जांचने के लिए 'टाइपऑफ (प्रतिक्रिया)' का उपयोग कर सकते हैं कि यह एक 'ऑब्जेक्ट' या 'स्ट्रिंग' है जो वापस आ गया है ... – Ropstah

2

आप कर रहे हैं 100% निश्चित है कि डेटा आप अपने jQuery खिला रहे हैं की साफ है दुर्भावनापूर्ण XSS हमले तो आप अपने लाभ के लिए जावास्क्रिप्ट की eval() विधि का उपयोग करने में सक्षम हो सकते हैं।

@SLaksa suggestion के लिए धन्यवाद उस गंदे eval() का उपयोग करने के लिए मैंने उपयोग किया।

आप $.parseJSON का उपयोग एक JSON ऑब्जेक्ट

function ajaxResponse(raw_data){ 
    try{ 
    // eval("var response="+raw_data); // try and avoid this if possible 
    var response = $.parseJSON(raw_data); 
    if (response){ 
     // We have a JSON inside the 'response' variable! 
    } 
    } catch(e){ 
    // We do not have a JSON. 
    // Probably HTML content. 
    // Might be a malformed JSON. 
    } 
} 

के रूप में कोड में वर्णित में पाठ का एक कच्चे स्ट्रिंग कन्वर्ट करने के लिए कर सकते हैं, सावधान रहना है कि अगर आप एक विकृत JSON ऑब्जेक्ट पारित फिर अपने कॉलबैक के रूप में देखते होंगे एचटीएमएल।

ध्यान दें कि आपके $.ajax() कॉल द्वारा निर्दिष्ट text होना चाहिए ताकि jQuery आपके लिए इसे पार्स करने का प्रयास न करे।


हम सब प्यार विकल्प है कि हमारे एक छोटा सा आसान जीवन बनाने - यहाँ अपनी स्थिति के लिए एक है।
क्यों हमेशा एक JSON ऑब्जेक्ट लौटाता है?यह शायद की तरह कुछ:

{"err":"","html":"<div>foobar<\/div>"} 

और एक त्रुटि के लिए:

{"err":"1","message":"You did not foo all of your bars yet!"} 
+1

नहीं; '$ .parseJSON' का उपयोग करें। – SLaks

+0

@ एसला - धन्यवाद! वास्तव में यह बेहतर विकल्प है। इसे प्रतिबिंबित करने के लिए संपादित किया गया। – Lix

2

टाइपफ़ोफ़ का उपयोग करें, यह आपके व्यवहार से संबंधित डेटा प्रकार की रिपोर्ट करेगा।

FIDDLE

1

क्यों न सिर्फ JSON का उपयोग एचटीएमएल वापस जाने के लिए और साथ ही?

क्या मैं आमतौर पर करते हैं मेरे लौटे JSON ऑब्जेक्ट इस तरह सेट किया गया है:

if (StuffIsValid()) { 
    ResponseWrite('{"s":0,"d":"<html>html code here</html>"}'); 
} else { 
    ResponseWrite('{"s":1,"d":{"errlist":["err1","err2"]}}'); 
} 
बेशक

:

{ 
    //s=status, d=data 
    "s":0, //0 means success, other numbers are for different errors 
    "d":{ /* Other JSON object or string here */ } 
} 

तो, आपके मामले में आप इस (छद्म) की तरह कुछ करना चाहते हैं , आप स्ट्रिंग का उपयोग करने के बजाय अपनी सर्वर-साइड भाषा पसंद के लिए अंतर्निहित JSON लाइब्रेरी का उपयोग करना चाहते हैं।

फिर, आपके jQuery success कॉलबैक में, मैं एस के मूल्य की जांच करता हूं।

$.ajax({ 
    url: 'url', 
    dataType: 'json', 
    success: function(data) { 
     if (data) { 
      //We have a JSON object 
      if (data.s === 0) { 
       //Success! 
       //Do stuff with data.d as a string 
      } else if (data.s === 1) { 
       //Failed validation 
       //Do stuff with data.d as an object 
      } else { 
       //How did this happen? 
      } 
     } else { 
      //Uh oh, no object, user must have been logged out (or something) 
     } 
    }); 

इस उपयोगकर्ता पेज आप जब से तुम तथ्य यह है कि दिए गए डेटा एक JSON ऑब्जेक्ट नहीं था पकड़ कर सकते हैं करने के लिए पोस्ट कर रहे हैं का उपयोग करने में लॉग इन करने की है, तो विशेष रूप से उपयोगी है।

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

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