Asp.net mvc 从ASP.NET MVC返回Json错误

Asp.net mvc 从ASP.NET MVC返回Json错误,asp.net-mvc,jquery,Asp.net Mvc,Jquery,我试图通过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(s

我试图通过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);
调试xhr.responseText会产生:
“”错误1。\u003cbr/\u003eErro2。\u003cbr。\u003e”“


有什么想法吗?

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

如果要返回HTML,可以在控制器中执行以下操作:

Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Content("Error 1.<br/>Error 2.<br/>"); 
Response.StatusCode=(int)HttpStatusCode.BadRequest;
返回内容(“错误1.
错误2.
”);
是的,你违背了@Hector所说的目的


如果你想返回真正的JSON,也许可以尝试返回一个
JSON(字典)
,而不是
JSON(字符串)

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

.ajax({...
    error: function(xhr, textStatus, exceptionThrown) {
        $('#result').html(JSON.parse(xhr.responseText));
    },
然后像
“Error 1.\u003cbr/\u003eErro2.\u003cbr.\u003e”这样的数据将转换为字符串
“Error 1.
Error 2.


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

最好返回错误列表,然后在客户端构建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);
Response.StatusCode=(int)HttpStatusCode.BadRequest;
列表错误=新列表();
//…一些处理
错误。添加(“错误1”);
//…一些处理
错误。添加(“错误2”);
返回Json(错误);
然后在客户端

 .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 />"));
  },
.ajax({。。。
错误:函数(xhr、textStatus、exceptionThrown){
var errorData=$.parseJSON(xhr.responseText);
var errorMessages=[];
//这个丑陋的循环是因为列表被序列化为对象而不是数组
for(错误数据中的var键)
{
errorMessages.push(errorData[key]);
}
$('#result').html(errorMessages.join(“
”); },

您还可以返回一个更具体的错误对象并使用模板解决方案,但这是我假设的想法。Avi,这太棒了。效果很好。非常感谢。您确定这不会返回成功吗?我通常是这样做的:返回Json(新的{success=false,errors=…});当您返回httpCode 500时,将调用error函数,而不是success函数。在您的解决方案中,您必须检查每个success函数以查看是否有错误。顺便说一句,无论您返回什么httpCode,都将调用Done/complete函数Returning HttpStatusCode.BadRequest在我们的测试环境中不起作用,但在m中起作用y dev environment。ajax失败函数从未被命中。有任何线索吗?嗨,Jeff,这很奇怪,看看DevTools,您是否从服务器返回400?可能有人在您的web.config中为它设置了一个覆盖,将重定向返回错误页,以防止用户查看错误页(如YSOD)jQueryReturning HttpStatusCode在我们的测试环境中不起作用,但在我的开发机器上起作用。ajax失败函数从未被命中。有任何线索吗?
 .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 />"));
  },