jquery – 当通过ajax执行post时,返回Bad Request,而不是JSON结果

前端之家收集整理的这篇文章主要介绍了jquery – 当通过ajax执行post时,返回Bad Request,而不是JSON结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Javascript
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!!! */ });

在Chrome中

标题

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”:”campo obrigatório.”}]

在铬中工作!

在IE8中

标题(请求)

POST /Motivos/Salvar HTTP/1.1
Accept: application/json,*/*; 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

不行!!

Asp.net MVC

过滤

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;
}

问题

>为什么没有xhr.resposeText对象?
>如何以与Chrome恢复相同的方式检索JSON?

我需要JSON来填写表单!

注意:03/11/2014

当我添加Response.TrySkipIisCustomErrors = true;在我的控制器,它的作品!
responseText返回的是json。
为什么?

解决方法

认为这是IIS尝试使用自定义错误响应而不是发送控制器正在生成错误消息的问题。
<system.webServer>
    ...
    <httpErrors existingResponse="PassThrough"></httpErrors>
    ...
</system.webServer>

要么

Response.TrySkipIisCustomErrors = true;

参考 – http://stackoverflow.com/a/4029197/1304559

查看这篇博文http://weblog.west-wind.com/posts/2009/Apr/29/IIS-7-Error-Pages-taking-over-500-Errors

由于响应代码设置为400,IIS将使用其自定义错误页面内容替换您的内容

猜你在找的jQuery相关文章