2010-10-11 37 views
29

Sto tentando di restituire un messaggio di errore tramite Json dal controller ASP.NET MVC. Voglio visualizzare ritorni a capo sullo schermo, in modo da l'errore sarà simile:restituisce errore Json da ASP.NET MVC

errore 1.
errore 2.

invece di "Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"

Ecco la mia ASP.NET MVC codice

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

JavaScript (omissis):

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

Debug i rendimenti xhr.responseText: ""Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e""

tutte le idee?

+0

ho letto a digiunare, il mio male : D. – bastijn

+0

Suppongo che sia un refuso. – Alex

risposta

62

sarebbe più bello restituire un elenco di errori e quindi creare l'html sul client.

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); 

e poi al lato client

.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 />")); 
    }, 

si possono anche restituire un oggetto di errore più specifico e l'utilizzo di una soluzione di modello, ma questa è l'idea

+0

Avi, questo è fantastico. Funziona come un fascino. Grazie mille. – Dean

+0

felice che abbia aiutato :) –

+1

Sei sicuro che questo non restituirà il successo? Di solito faccio: restituire Json (new {success = false, errors = ...}); – Santhos

12

Se si utilizza JSON probabilmente non si desidera incorporare HTML (questo genere di sconfitte lo scopo di restituire un "dati" oggetto che si sarà formato per la vista.)

Se si desidera tornare HTML si potrebbe fare questo nel controller:

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

Il ritorno di HttpStatusCode non funziona nel nostro ambiente di test ma funziona sulla mia macchina di sviluppo. La funzione di guasto ajax non viene mai colpita. Qualche indizio? – Jeff

2

Sì, si sta sconfiggendo lo scopo, come ha detto @Hector ..

E se si vuole restituire true JSON, magari provare restituire un Json(Dictionary<String, Object>) invece di a Json(string).

5

Mi sembra che tu abbia già fatto quasi tutto corretto. I risultati che hai nel xhr.responseText sono una stringa JSON. Per questo si deve inserire solo una chiamata aggiuntiva della funzione JSON.parse

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

quindi i dati come '"Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"' sarà convertito alla stringa 'Error 1.<br/>Error 2.<br/>'.

All'interno di success Event Handler la funzione di chiamata ajaxJSON.parse per voi, ma fare questo non all'interno del gestore error. Quindi convertire la risposta del server dalla stringa JSON che devi fare manualmente.

Problemi correlati