Подтвердить что ты не робот

Вернуть 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""

Любые идеи?

4b9b3361

Ответ 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).