ajax请求bad request,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(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。

为什么?