Asp.net MVC - Jquery $.ajax 错误回调未返回responseJSON

问题描述 投票:0回答:2

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

$.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 对象在从本地主机调用时有效,但在从远程计算机进行调用时无效,它返回为未定义... 有人可以帮助我吗? 预先感谢!

jquery asp.net ajax jsonresult
2个回答
14
投票

我也遇到过同样的问题。 当使用 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 以及所有东西一起工作后,我进行了测试并猜猜会发生什么?

当我使用 HttpResponseMessage 作为 WebAPI 中的返回类型并像这样返回时:

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出现。


2
投票

正如nebulous所建议的,

Response.TrySkipIisCustomErrors = true;
似乎是正确的方法。

不幸的是,大多数时候

IIS
会忽略这个属性,并跳过它(也许这就是开发者称它为
Try
的原因......)。

但是,我解决了将其添加到

Web.config
上的问题:

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

这更干净并且不会“弄脏”代码部分。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.