Asp.net MVC - Jquery $.ajax 错误回调未返回 responseJSON
Asp.net MVC - Jquery $.ajax error callback is not returning responseJSON
我有下面的代码,在开发机器上工作正常,但从远程浏览器调用时却不行...
$.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 在我的本地机器上进行测试时,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 控制器。我读到这是因为它要跨域,但这没有任何意义。
我创建了一个网络 API 控制器并将方法信息放在那里。这是因为我想使用 HttpReponseMessage 并且我认为它是 WebAPI 类型。
在获得模型和 json 以及所有可以协同工作的东西之后,我测试了你猜怎么着?
当我在 WebAPI 和 return 中使用 HttpResponseMessage 作为 return 类型时,如下所示:
return Request.CreateResponse(HttpStatusCode.BadRequest, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));
responseJSON 和 responseText 都正确填写。
我不知道为什么它不能正常工作,如果有人对此有回应,请告诉我们。
对我来说这是一个变通方法,因为我觉得它应该以第一种方式起作用。
更新:
将原始代码与 MVC 控制器一起使用 - 并添加
Response.TrySkipIisCustomErrors = true;
做出响应JSON。
正如 nebulous 所建议的那样,Response.TrySkipIisCustomErrors = true;
似乎是正确的方法。
不幸的是,大多数时候IIS
会忽略这个属性,并跳过它(也许这就是为什么开发人员称它为Try
...)。
但是,我解决了在 Web.config
上添加这个的问题:
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
它更简洁并且没有 "dirty" 代码部分。
希望对您有所帮助。
我有下面的代码,在开发机器上工作正常,但从远程浏览器调用时却不行...
$.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 在我的本地机器上进行测试时,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 控制器。我读到这是因为它要跨域,但这没有任何意义。
我创建了一个网络 API 控制器并将方法信息放在那里。这是因为我想使用 HttpReponseMessage 并且我认为它是 WebAPI 类型。 在获得模型和 json 以及所有可以协同工作的东西之后,我测试了你猜怎么着?
当我在 WebAPI 和 return 中使用 HttpResponseMessage 作为 return 类型时,如下所示:
return Request.CreateResponse(HttpStatusCode.BadRequest, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));
responseJSON 和 responseText 都正确填写。
我不知道为什么它不能正常工作,如果有人对此有回应,请告诉我们。
对我来说这是一个变通方法,因为我觉得它应该以第一种方式起作用。
更新: 将原始代码与 MVC 控制器一起使用 - 并添加
Response.TrySkipIisCustomErrors = true;
做出响应JSON。
正如 nebulous 所建议的那样,Response.TrySkipIisCustomErrors = true;
似乎是正确的方法。
不幸的是,大多数时候IIS
会忽略这个属性,并跳过它(也许这就是为什么开发人员称它为Try
...)。
但是,我解决了在 Web.config
上添加这个的问题:
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
它更简洁并且没有 "dirty" 代码部分。
希望对您有所帮助。