JSON.parse错误:项目发布后出现意外字符

时间:2019-03-17 05:52:28

标签: asp.net json asp.net-mvc-5 unobtrusive-ajax

在我看来,我使用了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列的意外字符

1 个答案:

答案 0 :(得分:0)

CustomErrors模式

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",resposne将包含有错误的json。