JSON-Fehler von ASP.NET MVC zurückgeben

Lesezeit: 3 Minuten

Benutzer-Avatar
Netzdraht

Ich versuche, eine Fehlermeldung über Json vom ASP.NET MVC-Controller zurückzugeben. Ich möchte Wagenrückläufe auf dem Bildschirm anzeigen, damit der Fehler wie folgt aussieht:

Fehler 1.
Fehler 2.

Anstatt von "Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"

Hier ist mein ASP.NET MVC-Code

Response.StatusCode = (int)HttpStatusCode.BadRequest;
string str = "Error 1.<br/>Error 2.<br.>";
return Json(str);

JavaScript (geschwärzt):

.ajax({...
     error: function(xhr, textStatus, exceptionThrown) {
        $('#result').html(xhr.responseText);
     },

Das Debuggen von xhr.responseText ergibt: ""Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e""

Irgendwelche Ideen?

  • Ich nehme an, ist ein Tippfehler.

    – Alex

    11. Oktober 2010 um 17:41 Uhr

Benutzer-Avatar
Avi Pinto

wäre schöner, eine Liste von Fehlern zurückzugeben und dann den HTML-Code beim Client zu erstellen.

Response.StatusCode = (int)HttpStatusCode.BadRequest;
List<string> errors = new List<string>();
//..some processing
errors.Add("Error 1");
//..some processing
errors.Add("Error 2");
return Json(errors);

und dann auf der Client-Seite

 .ajax({...
    error: function(xhr, textStatus, exceptionThrown) {
      var errorData = $.parseJSON(xhr.responseText);
      var errorMessages = [];
      //this ugly loop is because List<> is serialized to an object instead of an array
      for (var key in errorData)
      {
         errorMessages.push(errorData[key]);
      }
       $('#result').html(errorMessages.join("<br />"));
  },

Sie können auch ein spezifischeres Fehlerobjekt zurückgeben und eine Vorlagenlösung verwenden, aber das ist die Idee

  • Avi, das ist großartig. Klappt wunderbar. Ich danke dir sehr.

    – Netzdraht

    14. Oktober 2010 um 20:02 Uhr

  • Sind Sie sicher, dass dies keinen Erfolg bringen würde? Normalerweise mache ich: return Json(new { success = false, errors = … });

    – Santhos

    8. Dezember 2014 um 9:39 Uhr

  • Wenn Sie httpCode 500 zurückgeben, wird die Fehlerfunktion aufgerufen und nicht die Erfolgsfunktion. In Ihrer Lösung müssen Sie bei jeder Erfolgsfunktion überprüfen, ob Sie einen Fehler erhalten haben. Übrigens: Die Done/Complete-Funktionen werden aufgerufen, egal welchen httpCode Sie zurückgeben

    – AviPinto

    8. Dezember 2014 um 13:14 Uhr


  • Das Zurückgeben von HttpStatusCode.BadRequest funktioniert nicht in unserer Testumgebung, funktioniert aber in meiner Entwicklungsumgebung. Die Ajax-Fehlerfunktion wird nie getroffen. Irgendwelche Hinweise?

    – Speck

    8. Dezember 2016 um 3:01 Uhr

  • Hallo Jeff, das ist seltsam, schau dir die DevTools an, gibst du 400 vom Server zurück? Vielleicht hat jemand in Ihrer web.config eine Überschreibung dafür platziert, dass eine Umleitung zu einer Fehlerseite zurückgegeben wird, um zu verhindern, dass Benutzer Fehlerseiten (wie das YSOD) sehen können. Jeder Statuscode> 400 wird von jQuery als Fehler beim Client betrachtet

    – AviPinto

    8. Dezember 2016 um 8:04 Uhr


Wenn Sie JSON verwenden, möchten Sie wahrscheinlich kein HTML einbetten (dies widerspricht dem Zweck, ein „Daten“-Objekt zurückzugeben, das Sie in der Ansicht formatieren.)

Wenn Sie HTML zurückgeben möchten, können Sie dies in Ihrem Controller tun:

Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Content("Error 1.<br/>Error 2.<br/>"); 

  • Das Zurückgeben von HttpStatusCode funktioniert nicht in unserer Testumgebung, funktioniert aber auf meinem Entwicklungscomputer. Die Ajax-Fehlerfunktion wird nie getroffen. Irgendwelche Hinweise?

    – Speck

    8. Dezember 2016 um 3:03 Uhr

Benutzer-Avatar
Oleg

Mir scheint, Sie haben schon fast alles richtig gemacht. Die Ergebnisse, die Sie in der haben xhr.responseText ist ein JSON-String. Du solltest also nur einen zusätzlichen Anruf der einbauen JSON.parse Funktion

.ajax({...
    error: function(xhr, textStatus, exceptionThrown) {
        $('#result').html(JSON.parse(xhr.responseText));
    },

dann die Daten wie '"Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"' wird in den String umgewandelt 'Error 1.<br/>Error 2.<br/>'.

Innen success Event-Handler der ajax Funktionsaufruf JSON.parse für dich, aber es tut dies nicht innerhalb der error Handler. Das Konvertieren der Serverantwort aus dem JSON-String muss also manuell erfolgen.

Ja, Sie vereiteln den Zweck, wie @Hector sagte.

Und wenn Sie echtes JSON zurückgeben möchten, versuchen Sie vielleicht, a zurückzugeben Json(Dictionary<String, Object>) anstelle einer Json(string).

1257940cookie-checkJSON-Fehler von ASP.NET MVC zurückgeben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy