0

在我看来,我使用了 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:JSON 数据的第 1 行第 1 列出现意外字符

4

1 回答 1

0

自定义错误模式

使用 400 http 代码处理响应是 IIS 行为。因此,您需要删除该行

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 错误。

于 2019-03-17T17:07:14.140 回答