在我看来,我使用了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列的意外字符
答案 0 :(得分:0)
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。