如何使用ASP.NET MVC在jQuery AJAX调用中触发“错误”回调?

How do you trigger the “error” callback in a jQuery AJAX call using ASP.NET MVC?

这与我关于如何处理来自jQuery AJAX调用的错误的问题有关。 一些响应建议我使用"error"回调来显示jQuery AJAX调用中的任何错误。 我想知道如何使用ASP.NET MVC。 我的控制器操作是否有办法返回可从"错误"回调中访问的错误? 客户端代码看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
$.ajax({
   type:"POST",
   url:"MyUrl",
   data:"val1=test",
   success: function(result){
        // Do stuff
   },
   error: function(request,status,errorThrown) {

   }
 });

注意:嘿,这是在ASP.Net MVC甚至达到1.0之前发布的,从那以后我甚至没有看过框架。你可能应该停止提升这一点。

做这样的事情:

1
2
Response.StatusCode = (int)HttpStatusCode.BadRequest;
actionResult = this.Content("Error message here");

状态代码应根据错误的性质而改变;通常,4xx表示用户生成的问题,5xx表示服务器端问题。


如果你正在使用

1
[HandleError]

然后抛出一个HttpException将被捕获并路由到您的自定义错误页面。

另一种选择是使用

1
2
3
Response.StatusCode = 500;
Response.Write("Error Message");
Response.End();

可能有一种更方便的方式来写这个,但我还没有发现它。


如果您正在使用MVC 3,那么您可以在控制器中返回一个具有HTTP状态代码和状态消息的ActionResult:

1
return new HttpStatusCodeResult(500,"Error message");

然后,在你的错误回调中:

1
2
3
error: function (request, textStatus, errorThrown) {
    alert(request.statusText);
}


我寄给你一个建议;适用于受控和不受控制的例外。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  public class CodeExceptionToHttpFilter : FilterAttribute, IExceptionFilter
{
    public CodeExceptionToHttpFilter()
    {
      Order = 2;
    }
    public void OnException(ExceptionContext filterContext)
    {
      var codeException = filterContext.Exception as CodeException;
      var response = filterContext.RequestContext.HttpContext.Response;
  response.StatusCode = (codeException == null)? 550: 551;
      response.ContentType = MediaTypeNames.Text.Plain;
      response.Charset ="utf-8";
      response.Write(filter.Exception.Message);
      filterContext.ExceptionHandled = true;
      response.TrySkipIisCustomErrors = true;
   }

}

我的博客上有更多信息。
Gestión de errores en peticiones Ajax a MVC


根据此页面,您只需要在ASP.net页面上应用标题HTTP/1.0 500 Internal Server Error$.ajax请求将捕获该错误并执行error回调函数。 =]


我认为对于任何响应代码不是200的响应都会引发该事件。但是我无法在文档中找到这方面的证据。

要从代码(在Webforms中工作)执行此操作:

1
throw new HttpException(500,"Error message");