【问题标题】:return Json error from ASP.NET MVC从 ASP.NET MVC 返回 Json 错误
【发布时间】:2010-10-11 17:37:56
【问题描述】:

我正在尝试通过 Json 从 ASP.NET MVC 控制器返回错误消息。我想在屏幕上显示回车,所以错误看起来像:

错误 1。
错误 2。

而不是"Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"

这是我的 ASP.NET MVC 代码

Response.StatusCode = (int)HttpStatusCode.BadRequest;
string str = "Error 1.<br/>Error 2.<br.>";
return Json(str);

JavaScript(已编辑):

.ajax({...
     error: function(xhr, textStatus, exceptionThrown) {
        $('#result').html(xhr.responseText);
     },

调试 xhr.responseText 产生:""Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e""

有什么想法吗?

【问题讨论】:

  • 我假设 是一个错字。

标签: asp.net-mvc jquery


【解决方案1】:

最好返回一个错误列表,然后在客户端构建 html。

Response.StatusCode = (int)HttpStatusCode.BadRequest;
List<string> errors = new List<string>();
//..some processing
errors.Add("Error 1");
//..some processing
errors.Add("Error 2");
return Json(errors);

然后在客户端

 .ajax({...
    error: function(xhr, textStatus, exceptionThrown) {
      var errorData = $.parseJSON(xhr.responseText);
      var errorMessages = [];
      //this ugly loop is because List<> is serialized to an object instead of an array
      for (var key in errorData)
      {
         errorMessages.push(errorData[key]);
      }
       $('#result').html(errorMessages.join("<br />"));
  },

您也可以返回更具体的错误对象并使用模板解决方案,但这就是想法

【讨论】:

  • Avi,这太棒了。奇迹般有效。非常感谢。
  • 你确定这不会返回成功吗?我通常这样做:return Json(new { success = false, errors = ... });
  • 当您返回httpCode 500 时,将调用错误函数而不是成功函数。在您的解决方案中,您必须检查每个成功功能以查看是否有错误。顺便说一句,无论您返回什么 httpCode,都将调用 Done/complete 函数
  • 返回 HttpStatusCode.BadRequest 在我们的测试环境中不起作用,但在我的开发环境中起作用。 ajax 失败函数永远不会被命中。有什么线索吗?
  • 嗨 Jeff,这很奇怪,看看 DevTools,你是从服务器返回 400 吗?也许在您的 web.config 中,有人对其进行了覆盖,将重定向返回到错误页面,以防止用户查看错误页面(如 YSOD)任何状态代码 > 400 将被 jQuery
【解决方案2】:

如果您使用的是 JSON,您可能不想嵌入 HTML(这违背了返回您将在视图上格式化的“数据”对象的目的。)

如果您想返回 HTML,您可以在控制器中执行此操作:

Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Content("Error 1.<br/>Error 2.<br/>"); 

【讨论】:

  • 返回 HttpStatusCode 在我们的测试环境中不起作用,但在我的开发机器上起作用。 ajax 失败函数永远不会被命中。有什么线索吗?
【解决方案3】:

在我看来,你几乎已经把所有的事情都做对了。 xhr.responseText 中的结果是一个 JSON 字符串。所以你应该只插入一个额外的JSON.parse函数调用

.ajax({...
    error: function(xhr, textStatus, exceptionThrown) {
        $('#result').html(JSON.parse(xhr.responseText));
    },

那么'"Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"'之类的数据将被转换为字符串'Error 1.&lt;br/&gt;Error 2.&lt;br/&gt;'

success 事件处理程序内部,ajax 函数会为您调用JSON.parse,但它不是error 处理程序内部执行此操作。因此,您必须手动从 JSON 字符串转换服务器响应。

【讨论】:

    【解决方案4】:

    是的,你违背了@Hector 所说的目的......

    如果您想返回真正的 JSON,不妨尝试返回 Json(Dictionary&lt;String, Object&gt;) 而不是 Json(string)

    【讨论】:

      猜你喜欢
      • 2015-05-11
      • 2011-01-23
      • 1970-01-01
      • 2010-12-04
      • 2011-08-03
      • 2019-10-12
      • 2023-03-18
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多