jQuery, AJAX und Umgang mit unterschiedlichen Datentypen
Ich bin mit ASP.Net MVC, aber das gilt für alle Rahmen.
Mache ich einen Ajax-Aufruf zu meinem server, welche die meiste Zeit kehrt plain old HTML, aber wenn es ist ein Fehler, ich möchte es wieder eine JSON-Objekt mit einer status-Meldung (und ein paar andere Dinge). Es scheint nicht ein Weg für die dataType
option in den jQuery-Aufruf, um diese zu bewältigen. Standardmäßig scheint es, zu analysieren, alles als html an, was zu einer <div>
wird aufgefüllt mit "{ status: 'error', message: 'something bad happened'}"
.
[Bearbeiten] Ignorieren die dataType
Objekt und Vermietung jQuery herauszufinden, funktioniert auch nicht. Sie sieht den Typ des Ergebnisses als string
und behandelt es als HTML.
Einer Lösung kam ich mit ist zu versuchen, analysieren die Ergebnis-Objekt als JSON. Wenn das funktioniert, wir wissen, es ist ein JSON-Objekt. Wenn es wirft eine Ausnahme, es ist HTML:
$.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'
});
Jedoch eine Ausnahme in dieser Weise, scheint mir ein ziemlich schlechtes design (und unintuitive, um das Mindeste zu sagen). Gibt es einen besseren Weg? Ich dachte, das einwickeln der gesamten Reaktion in ein JSON-Objekt, aber in diesem Fall, ich glaube nicht, dass das eine option.
Hier ist die Lösung, die ich von Steve Willcock:
//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'
});
InformationsquelleAutor swilliams | 2009-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Ihre JSON-Fehler, die Sie zurückgeben könnte ein 500-Statuscode vom server anstelle von 200. Dann die jquery-client-code verwenden können, den Fehler: handler auf den $.ajax-Funktion für die Fehlerbehandlung. Auf eine Antwort 500 Sie können zum Parsen der JSON-error-Objekt aus, responseText, auf eine 200 Antwort, Sie können einfach bringen Sie Ihre HTML in einem div als normal.
Fantastisch. Ich bin ein kleines bisschen leary von über 500 für etwas anderes als einen kritischen Fehler, aber ich denke, es ist immer noch die beste option hier. Ich werde den Beitrag editieren, damit etwas code.
Rücksendung 400 (Bad Request) kann besser sein als 500...
InformationsquelleAutor Steve Willcock
Während Steve ' s Idee ist gut, ich bin das hinzufügen dieser für Vollständigkeit.
Scheint es, dass, wenn Sie geben Sie einen Datentyp json, aber die Rückkehr HTML, jQuery verarbeitet es in Ordnung.
Getestet habe ich diese Theorie mit dem folgenden code:
Den
$_GET['type']
nur so kann ich kontrollieren, was die Rückgabe beim testen. In Ihrer situation, die Sie würde wieder in die eine oder die andere, je nachdem, ob Dinge richtig oder falsch. Vergangenheit, dass, mit dieser jQuery-code:Obwohl wir angegeben JSON als Datentyp, jQuery (1.3.2) zahlen darauf hin, dass es nicht so ist.
So könnte man dies nutzen (soweit ich weiß) nicht dokumentierte Verhalten zu tun, was Sie wollen.
Mm. Von einer Sekunde.
Die Antwort, die ASP.NET von ASP.NET MVC wird analysiert, wie ein Fehler. Wenn ich mit der error () - callback von jQuery kann ich den HTML - ... das funktioniert, aber wie mein exception-handling-code, scheint nicht "richtig". Wenn ich mit PHP, dies würde auf jeden Fall eine gültige Lösung wenn.
Sorry, ich bin nicht vertraut mit .NET so dass ich nicht wirklich verstehen, wie diese nicht gelten. Dachte nur, ich würde es teilen.
Keine Sorge, ich mochte Ihre Antwort, und es half auch unabhängig. Ich noch von Ihnen positiv bewertet werden. 😉
InformationsquelleAutor Paolo Bergantino
Aber warum nicht wieder nur JSON-unabhängig des status (Erfolg oder Fehler) auf die POST und verwenden Sie einen GET, um die Ergebnisse anzuzeigen?
Wie es scheint, ein besserer Ansatz, wenn Sie mich Fragen.
InformationsquelleAutor andi
Oder man konnte immer wieder eine JSON-Antwort, und einen parameter als HTML-Inhalt.
Etwas wie:
Ich denke Sie würden nur zu entkommen doppelten Anführungszeichen in den html-Wert, und der json-parser würde rückgängig machen das für Sie.
InformationsquelleAutor jaminto
Lief ich in genau dem gleichen Problem mit MVC/Ajax/JQuery und nutzen wollen, die mehrere Datentypen (JSON und HTML). Ich habe einen AJAX-request wird eine HTML-Datentyp, um die Daten zurückzugeben, aber ich Versuch konvertieren Sie die Daten, die zurück kommt von den ajax-request ein JSON-Objekt. Ich habe eine Funktion wie diese, die ich Anruf von meinem Erfolg-Rückruf:
Ich dann davon ausgehen, dass wenn die jsonObject und errorMessage-Eigenschaft existiert, dass ein Fehler aufgetreten ist, andernfalls wird ein Fehler nicht auftreten.
InformationsquelleAutor contactmatt
Habe ich erreicht dies durch die Verwendung der ajax-success-und error-callbacks nur. Auf diese Weise kann ich habe gemischte strings und json Objekte, die Antworten vom server.
Unten ich bin bereit zu akzeptieren, json, aber wenn ich den status "parsererror" (im Sinne von jquery konnte nicht analysiert die eingehenden code als json-denn das ist, was ich erwartet hatte), aber es wurde ein Antrag den status "OK" (200), dann umgehe ich die Antwort als string. Jedes Ding, das andere als ein "parsererror" und "OK", ich handle wie ein Fehler.
InformationsquelleAutor ubergoober