2012-04-16 12 views
5

Ho un modulo che viene inviato al server tramite jQuery .ajax() POST. Se il modulo ha superato la convalida sul lato server, il server restituirebbe il risultato in HTML per il client-end per aggiornare la sua presentazione di conseguenza. Se, tuttavia, il modulo non ha superato la convalida, il server restituirebbe il risultato in JSON, che consiste negli errori di convalida.

Entrambi i tipi di risultato finirebbero nel gestore success di .ajax(). Poiché entrambi i tipi sono possibili, il gestore ha bisogno di un modo per determinare se il risultato è HTML o JSON. Come lo posso fare?

Nota: in superficie, la mia domanda è la stessa di this existing SO question ma non sono la stessa cosa. In questa domanda, c'è un solo tipo di dati possibile (HTML o JSON), mentre il mio problema è di trovare un modo per gestire due possibili tipi di dati (HTML e JSON).

risposta

3

Per i dati JSON, typeof(data) saranno object. Per i dati html sarà string.

Almeno con i dati restituiti da azioni ASP.NET MVC3 funziona. Suppongo che sia il tipo mime che decide come jquery gestisce i dati restituiti.

+0

L'ho già provato con alcune chiamate Ajax di base e sembra funzionare bene. Mi hai battuto di 30 secondi sulla risposta però. – adeneo

5

Se si lascia il parametro dataType vuoto, jQuery determinerà questo in base al tipo MIME:

dataTypeString

predefinito: Indovina intelligente (XML, JSON, uno script o HTML)

Il tipo di dati che ci si aspetta dal server. Se non viene specificato, jQuery cercherà di dedurre che in base al tipo MIME della risposta

ref: http://api.jquery.com/jQuery.ajax/

+0

Il mio problema è che ho due blocchi di codice diversi da eseguire, a seconda del tipo di dati in cui si trovano i dati restituiti. Il gestore 'successe' ha un'istruzione' if' per capire quale blocco di codice eseguire, ma non lo faccio so cosa può usare l'istruzione 'if' per controllare. – tamakisquare

+1

jQuery lo avrà già analizzato, quindi sarà un oggetto Javascript valido se fosse JSON e una stringa se è HTML. – Paystey

+1

@ahmoo: come dice Paystey, puoi usare 'typeof (response)' per verificare se si tratta di un 'object' o' stringa' che viene restituito ... – Ropstah

2

Se si è al 100% che i dati che si sta alimentando il vostro jQuery è pulita attacchi XSS malevoli, quindi potresti essere in grado di utilizzare il metodo eval() di JavaScript a tuo vantaggio.

Grazie a @SLaks per a suggestion per scambiare quel brutto eval() che ho usato.

È possibile utilizzare $.parseJSON per convertire una stringa grezza di testo in un oggetto 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. 
    } 
} 

Come menzionato nel codice, fate attenzione che se si passa un oggetto JSON malformati allora il callback vedrà questa come HTML.

Si noti che il numero dataType specificato dalla chiamata $.ajax() deve essere text in modo che jQuery non tenti di analizzarlo per conto dell'utente.


Tutti noi amiamo le alternative che rendono la nostra vita un po 'più semplice - eccone uno per la vostra situazione.
Perché non sempre restituire un oggetto JSON?Qualcosa di simile, forse:

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

E per un errore:

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

No; usa '$ .parseJSON'. – SLaks

+0

@sla - grazie! In effetti questa è la scelta migliore. Modificato per riflettere questo. – Lix

2

Usa typeof, riporterà il tipo di dati con cui hai a che fare.

FIDDLE

1

Perché non usare JSON per restituire il codice HTML come bene?

Quello che di solito fare è impostare il mio oggetto JSON tornato in questo modo:

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

Quindi, nel tuo caso si farebbe qualcosa di simile (pseudo):

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

Naturalmente , dovresti usare la libreria JSON integrata per il tuo linguaggio sul lato server invece di usare le stringhe.

Quindi, nel callback jQuery success, farei un controllo per il valore di s.

$.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) 
     } 
    }); 

Ciò è particolarmente utile se l'utente deve essere registrato per accedere alla pagina che stai distacco per quanto è possibile catturare il fatto che i dati restituiti non era un oggetto JSON.

Problemi correlati