Ich benutze ASP.Net MVC, aber das gilt für jedes Framework.jQuery AJAX und Umgang mit verschiedenen dataTypes
Ich mache einen Ajax-Aufruf an meinen Server, der die meiste Zeit einfach alten HTML zurückgibt, aber wenn es einen Fehler gibt, möchte ich ein JSON-Objekt mit einer Statusmeldung (und ein paar andere Dinge). Es scheint keinen Weg für die dataType
Option in der jQuery-Aufruf zu sein, damit gut umzugehen. Standardmäßig scheint alles als html zu parsen, was dazu führt, dass <div>
mit "{ status: 'error', message: 'something bad happened'}"
gefüllt wird.
[Bearbeiten] Das dataType
Objekt zu ignorieren und jQuery herauszufinden, funktioniert auch nicht. Es sieht den Typ des Ergebnisses als string
und behandelt es als HTML.
Eine Lösung, die ich gefunden habe, ist, das Ergebnisobjekt als JSON zu parsen. Wenn das funktioniert, wissen wir, dass es ein JSON-Objekt ist. Wenn es eine Ausnahme auslöst, es HTML ist:
$.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 Art und Weise unter Verwendung kommt mir ziemlich schlechtes Design (und nicht intuitiv, gelinde gesagt). Gibt es einen besseren Weg? Ich dachte daran, die gesamte Antwort in ein JSON-Objekt zu verpacken, aber in diesem Fall halte ich das nicht für eine Option.
Hier ist die Lösung, die ich von Steve Willcock bekam:
// 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'
});
Hmmm, interessante Situation, aber ich weiß nicht, ob ein Verfahren mit unterschiedlichen Typen zurückgeben ist die beste Idee - vielleicht sollten Sie die erste Methode ein bool zurückgeben, und dann in dem .ajax Rückruf $ können Sie Rufen Sie eine andere Methode auf, die die Statusmeldung zurückgibt. –