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

fcy6dtqo  于 4个月前  发布在  .NET
关注(0)|答案(2)|浏览(71)

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

$.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;
  }
});

字符串
responseJSON对象在从本地主机调用时工作,但在从远程计算机调用时不工作,它返回为undefined...有人能帮助我吗?提前感谢!
x1c 0d1x的数据

bpsygsoo

bpsygsoo1#

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

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

字符串
我还专门为CumberResult尝试了以下操作:

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,我认为这是一个Web API类型。在获得模型和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出现。

q7solyqu

q7solyqu2#

正如nebulous所建议的那样,Response.TrySkipIisCustomErrors = true;似乎是正确的方法。
不幸的是,大多数时候IIS会忽略这个属性,并跳过它(也许这就是为什么开发人员称之为Try.)。
但是,我修复了在Web.config上添加此功能的问题:

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

字符串
它更干净,不会“弄脏”代码部分。
希望对你有帮助。

相关问题