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'
});
Hmmm, interessante situation, aber ich weiß nicht, ob eine Methode zurück, andere Typen ist die beste Idee - vielleicht sollte man die erste Methode, die Rückgabe ein boolescher Wert, und dann in der $.ajax-callback können Sie eine andere Methode aufgerufen, wird wieder die Statusmeldung.

InformationsquelleAutor swilliams | 2009-05-11

Schreibe einen Kommentar