Вернуть Json-ошибку из ASP.NET MVC
Я пытаюсь вернуть сообщение об ошибке через Json из контроллера ASP.NET MVC. Я хочу отображать возврат каретки на экране, поэтому ошибка будет выглядеть так:
Ошибка 1.
Ошибка 2.
вместо "Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"
Здесь мой код ASP.NET MVC
Response.StatusCode = (int)HttpStatusCode.BadRequest;
string str = "Error 1.<br/>Error 2.<br.>";
return Json(str);
JavaScript (отредактирован):
.ajax({...
error: function(xhr, textStatus, exceptionThrown) {
$('#result').html(xhr.responseText);
},
Отладка xhr.responseText дает: ""Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e""
Любые идеи?
Ответы
Ответ 1
было бы лучше вернуть список ошибок, а затем создать html на клиенте.
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);
а затем на стороне клиента
.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 />"));
},
вы также можете вернуть более конкретный объект ошибки и использовать решение шаблона, но это идея
Ответ 2
Если вы используете JSON, вы, вероятно, не хотите вставлять HTML (этот вид побеждает цель возврата объекта "данных", который вы будете форматировать в представлении.)
Если вы хотите вернуть HTML, вы можете сделать это в своем контроллере:
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Content("Error 1.<br/>Error 2.<br/>");
Ответ 3
Мне кажется, что вы уже сделали почти все правильно. Результаты, которые у вас есть в xhr.responseText
, являются строкой JSON. Поэтому вы должны вставить только один дополнительный вызов функции JSON.parse
.ajax({...
error: function(xhr, textStatus, exceptionThrown) {
$('#result').html(JSON.parse(xhr.responseText));
},
тогда данные типа '"Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"'
будут преобразованы в строку 'Error 1.<br/>Error 2.<br/>'
.
Внутри обработчика события success
вызов функции ajax
вызывает JSON.parse
для вас, но он делает это не внутри обработчика error
. Поэтому, чтобы преобразовать ответ сервера из строки JSON, вам нужно сделать вручную.
Ответ 4
Да, вы побеждаете цель, как @Hector сказал.
И если вы хотите вернуть истинный JSON, попробуйте вернуть Json(Dictionary<String, Object>)
вместо Json(string)
.