Ошибка JSON.parse: неожиданный символ после выпуска проекта - PullRequest
0 голосов
/ 17 марта 2019

Я использовал jquery.unobtrusive-ajax на мой взгляд.В этом представлении есть форма, которая отправляется через ajax.

В действии, если наборы моделей недействительны, я верну ошибки с помощью кода ниже

 Response.StatusCode = (int)HttpStatusCode.BadRequest;
 return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) });

И впри просмотре кода ниже я показываю пользователю ошибки.

        function failed(err1) {
        obj = JSON.parse(err1.responseText).errors;
        console.log(obj);
        EmptyValidationErrors();
        jQuery.each(obj, function (i) {
            //alert(obj[i].ErrorMessage);
            AddValidationError(obj[i].ErrorMessage);
            ShowValidationErrors();
        });
    }

SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON

1 Ответ

0 голосов
/ 17 марта 2019

Режим CustomErrors

Это поведение IIS для обработки ответов с кодом HTTP 400.Итак, вам нужно удалить эту строку

Response.StatusCode = (int)HttpStatusCode.BadRequest;

и добавить дополнительные данные в ваш ответ.вот так:

if (ModelState.IsValid) {
  return Json(new { success = true });
}

return Json(new { success = false, errors = ModelState.Values.SelectMany(v => v.Errors) });

И прочитайте это в своем JS-коде так:

$.ajax({
  url: url,
  method: 'POST',
  success: function(data) {
    if (!data.success) {
      $.each(data.errors, function(i, error) {
         AddValidationError(error.ErrorMessage);
      });
      ShowValidationErrors();
    }
  }
});

В вашем Web.config вы можете найти такой раздел:

<customErrors mode="Off">
</customErrors>

mode="Off" переписать на mode="On" во время процесса развертывания, поэтому при производстве любые ответы с кодом 400 обрабатываются другим способом, чем при отладке.В Web.Release.config вы можете найти, что именно переписывает в этом разделе

Обновление

Другое решение:

Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) });

Это остановит обработку пользовательской ошибки mode="On" и Resposne будетсодержит ваш JSON с ошибками.

...