jqXHR = $.ajax({ url: $frm.attr("action"), type: "POST", dataType: "json", cache: false, headers: headers, contentType: "application/json;charset=UTF-8", data: ko.mapping.toJSON(data, map), beforeSend: function(x) { if (x && x.overrideMimeType) { return x.overrideMimeType("application/json;charset=UTF-8"); } } }); jqXHR.fail(function(xhr, err, msg) { /* xhr.responseText NEED TO BE JSON!!! */ });
标头
Request Method:POST Status Code:400 Bad Request Request Headersview source Accept:application/json, text/javascript, */*; q=0.01 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4 Connection:keep-alive Content-Length:10 Content-Type:application/json;charset=UTF-8 User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36 X-Requested-With:XMLHttpRequest Request Payloadview source {Id:0} Response Headersview source Cache-Control:private Content-Length:54 Content-Type:application/json; charset=utf-8 Date:Thu, 27 Feb 2014 14:01:59 GMT Server:Microsoft-IIS/8.0 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.1 X-Powered-By:ASP.NET
响应
[{“ Name”:“ Nome”,“ ErrorMessage”:“ campoobrigatório。”}]
适用于Chrome!
标头(请求)
POST /Motivos/Salvar HTTP/1.1 Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: pt-br x-requested-with: XMLHttpRequest Content-Type: application/json;charset=UTF-8 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Content-Length: 10 Connection: Keep-Alive Pragma: no-cache
标头(响应)
HTTP/1.1 400 Bad Request Cache-Control: private Content-Type: text/html Server: Microsoft-IIS/8.0 X-AspNetMvc-Version: 5.1 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 27 Feb 2014 13:51:46 GMT Content-Length: 11 Bad Request
不行!!
public class HandleExceptionAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null) { filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; var ex = filterContext.Exception.GetBaseException(); filterContext.Result = new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet, Data = new { ex.Message, ex.GetType().Name } }; filterContext.ExceptionHandled = true; } else { base.OnException(filterContext); } } }
应用于GlobalFilterCollection
[ValidateJsonAntiForgeryToken, HttpPost] public virtual JsonResult Salvar(TViewModel viewModel) { if (ModelState.IsValid) { TEntity model; if (default(TKey).Equals(viewModel.Id)) { model = Mapper.Map<TEntity>(viewModel); AdicionarEntidade(model, viewModel); } else { model = Repositorio.Get(viewModel.Id); Mapper.Map(viewModel, model, typeof(TViewModel), typeof(TEntity)); SalvarEntidade(model, viewModel); } return SalvarResult(model); } Response.StatusCode = 400; return Json(ModelState.ToJson(), JsonRequestBehavior.AllowGet); }
public static object ToJson(this ModelStateDictionary dic, params string[] othersMessages) { var states = (from e in dic where e.Value.Errors.Count > 0 select new { Name = e.Key, e.Value.Errors[0].ErrorMessage }).ToList(); if (othersMessages != null) foreach (var message in othersMessages) states.Add(new { Name = "", ErrorMessage = message }); return states; }
我需要JSON来填充表单!
当我添加Response.TrySkipIisCustomErrors = true;控制器时,它就可以工作了!responseText返回json。为什么?
Response.TrySkipIisCustomErrors = true;
认为这是IIS尝试使用自定义错误响应而不是发送控制器正在生成的错误消息的问题。
<system.webServer> ... <httpErrors existingResponse="PassThrough"></httpErrors> ... </system.webServer>
要么
参考-https: //stackoverflow.com/a/4029197/1304559
查看此博客文章http://weblog.west-wind.com/posts/2009/Apr/29/IIS-7-Error-Pages- taking-over-500-Errors
由于响应代码设置为400,因此IIS将其内容替换为其自定义错误页面内容