【问题标题】:Asp.net MVC - Jquery $.ajax error callback is not returning responseJSONAsp.net MVC - Jquery $.ajax 错误回调未返回 responseJSON
【发布时间】:2016-08-29 18:41:35
【问题描述】:

我有下面的代码,在开发机器上可以正常工作,但从远程浏览器调用时却不行...

$.ajax({
  type: 'POST',
  url: '@Url.Action("Action", "Controller")',
  data: { id: id },
  dataType: 'json',
  async: true,
  success: function (data) {
  },
  error: function (jqXHR, status, err) {
    var result = jqXHR.responseJSON;
  }
});

jqXHR.responseJSON 对象在从 localhost 调用时有效,但在从远程计算机进行调用时无效,它返回为未定义... 有人可以帮助我吗? 提前致谢!

【问题讨论】:

  • 你在jqXHR 中得到了什么?
  • 嗨,杰森,感谢您的回复!在开发机器上,它正确返回了一个responseJSON数组以及一个带有json字符串的reponseText,但是从远程机器调用时,responseJSON对象不存在,返回null,并且responseText只包含“Bad request message”因为我已将响应状态代码签署为 400。我已用结果图片编辑了问题...
  • 控制台有错误吗?它与CORS有关吗?控制台中的任何内容,例如“Access-Control -Origin....”

标签: jquery asp.net ajax jsonresult


【解决方案1】:

我也遇到过同样的问题。 当使用 localhost 在我的本地机器上进行测试时,ResponseJSON 被填充。 当我将项目上传到测试服务器并进行测试时,我的 responseJSON 是未定义的,并且 responseTEXT 只是给出了我发送的状态描述:
(这是一个 JSONResult 但我已将其作为 ActionResult 完成)

Response.StatusCode = 400;
Response.StatusDescription = "Bad Request - Model State is Invalid";
return Json(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)), JsonRequestBehavior.AllowGet);

对于 ActionResult 我也特别尝试过:

return new HttpStatusCodeResult(400, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));

这给了我一堆错误。

我尝试使用 JsonResult 以下代码,该代码在本地工作(但我在 JSON 中有语法错误)但在测试服务器上没有工作。

return Json(new { success = false, responseJSON = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)) }, JsonRequestBehavior.AllowGet);

这是我最近使用 AJAX 请求将表单模型提交到 MVC 控制器时的测试(上图)。我读到这是因为它是跨域的,但这没有意义。

我创建了一个 Web API 控制器并将方法信息放入其中。这是因为我想使用 HttpReponseMessage 并且我认为这是一种 WebAPI 类型。 在得到模型和 json 以及所有东西一起工作后,我测试并猜猜是什么?

当我在 WebAPI 中使用 HttpResponseMessage 作为返回类型并返回如下:

return Request.CreateResponse(HttpStatusCode.BadRequest, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));

responseJSON 和 responseText 都正确填写。

我不知道为什么它不起作用,如果有人对此有回应,请告诉我们。

对我来说,这是一种解决方法,因为我觉得它应该以第一种方式工作。

更新: 将原始代码与 MVC 控制器一起使用 - 并添加

Response.TrySkipIisCustomErrors = true;

让 responseJSON 出现。

【讨论】:

  • 是的,这很奇怪!我会试试你的解决方案,看看它是否适用于 mvc 项目......非常感谢!
  • @JuniorSilva 使用 Request.TrySkipIisCustomerErrors = true;在 MVC 控制器上使用 ActionResult 返回 Json(Serializing model errors, AllowGet);
  • 是的!它就像一个迷人的......非常感谢大家,救了我的命!
  • 你真的拯救了我的一天。 @nebulous
【解决方案2】:

正如 nebulous 所建议的,Response.TrySkipIisCustomErrors = true; 似乎是正确的方法。

不幸的是,大多数时候IIS 会忽略这个属性,并跳过它(也许这就是为什么开发人员称它为Try...)。

但是,我解决了在 Web.config 上添加此问题的问题:

<system.webServer>
  <httpErrors existingResponse="PassThrough" />
</system.webServer>

它更干净,不会“弄脏”代码部分。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2010-09-29
    • 2010-10-27
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多