【问题标题】:How to return JSON object when Bad Request MVC错误请求 MVC 时如何返回 JSON 对象
【发布时间】:2016-01-13 17:59:48
【问题描述】:

我正在开发 MVC 4 项目。

我有一个在 Ajax Post 请求完成时执行的操作。

在某些情况下,我可以准确确定,我必须将Response 对象的Status 属性设置为HttpBadRequest 值,并返回包含一些数据的JSON 对象以显示给最终用户。

问题是我无法在 javascript 方法中接收 JSON 对象, 我收到了别的东西。这是因为我将 Response 的 Status 属性设置为 HttpBadRequest 值。

这里是详细信息

动作

// this method will executed when some Ajax Post request.
[HttpPost]
public ActionResult Delete(int id)
{
    // some code here ......

    // in some case we will determine an error like this
    if(error)
    {
        HttpContext.Response.Clear();
        HttpContext.Response.TrySkipIisCustomErrors = true;
        HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;

        return Json(new
        {
            Message = string.Format(format, values),
            Status = messageType.ToString()
        });
    }
}

我想从这样的 javascript 函数中读取返回的 JSON 对象

Javascript

function OnDeleteFailed(data) {
    debugger;
    var try1 = $.parseJSON(data.responseText);
    var try2 = JSON.parse(data.responseJSON);
}

问题在于 JSON 对象将填充 javascript 的 data 变量。 在调试 Javascript 代码时,我在 data 变量中得到以下信息

当我从动作中删除这一行时最奇怪的事情

HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;

然后我正确收到了 JSON 对象,我可以将其读取为以下内容

注意:我收到了正确的 JSON 对象,但在其他 Javascript 函数中。 (现在我在 OnDeleteSuccess 函数中接收 JSON 对象,而不是在 OnDeleteFailed 函数中。

所以问题是:代码有什么问题,所以如果我将“Response”对象的“StatusCode”属性设置为“ BadRequest”值?

我搜索了很多答案(从昨天到现在),经过长时间的搜索,这是与我最相关的question,但不幸的是,该问题的解决方案对我根本不起作用。

更新

这里是Web.config 文件的sn-p,它设置了IIS 的一些httpErrors。 本次更新回应提示错误原因将来自此点

<system.webServer>
   <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error statusCode="404" responseMode="ExecuteURL" path="/Home/PageNotFound" />
   </httpErrors>
</system.webServer>

任何想法都会受到赞赏。

【问题讨论】:

  • 可能是 IIS 自定义错误干扰了响应。
  • @haim770 我在 web.config 文件中设置了一些客户错误,这是否与我的问题有关
  • @haim770 我将编辑我的问题以包含包含一些 IIS 自定义错误的 Web.Config 文件的 sn-p
  • &lt;customErrors mode="Off" /&gt;&lt;system.web&gt; 之下吗?
  • 尝试将existingResponse改为PassThrough

标签: javascript c# json model-view-controller bad-request


【解决方案1】:

在您的Web.Config 中,尝试将existingResponse 更改为Auto

<httpErrors errorMode="Custom" existingResponse="Auto">

Documentation

【讨论】:

  • 根据这个答案:stackoverflow.com/a/21271085 - Auto 更好,因为它会考虑TrySkipIisCustomErrors,如果没有设置,只会考虑Replace
猜你喜欢
  • 2020-10-16
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多