JSON.parse error: unexpected character after project release

JSON.parse error: unexpected character after project release

在我看来我用了jquery.unobtrusive-ajax。 在此视图中,有一个通过 ajax.

提交的表单

在操作中如果模型集无效,我会return通过下面的代码

错误
 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: unexpected character at line 1 column 1 of the JSON data

自定义错误模式

IIS 的行为是处理 400 http 代码的响应。所以,你需要删除那行

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" 并且响应将包含您的 json 错误。