2016-04-28 35 views
1

我使用下面的代码在我的MVC控制器来处理异常:如何避免MVC重置ExceptionContext.Result?

protected override void OnException(ExceptionContext filterContext) 
{  
    if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
       { 
        filterContext.Result = new JsonResult 
        { 
         JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
         Data = new { Error = true, Msj = filterContext.Exception.Message } 
        }; 
       } 
    } 

在前端我使用angularjs($ HTTP)执行请求。

如果我设置filterContext.ExceptionHandled为true,$ http将执行successCallback函数,但如果我没有设置它,.Net会将filterContext.Result重置为tipycal黄页。

我要管理与errorCallback函数($ HTTP)的错误,但避免净重置JsonResult的Data财产

没有人有任何想法如何实现的呢?

任何帮助将不胜感激= d

回答

1

$http服务不default发送X-Requested-With头。您需要明确启用它。

var app = angular.module('yourApp', []); 

app.config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; 
}]); 

编辑:按注释

的问题是,净替换 '数据' 属性

因为你缺少两件事情在你的OnException方法。

  1. 您需要的ExceptionHandled属性设置为true使框架不会做正常的异常处理程序,并返回页面死亡的默认黄屏。

  2. 您需要指定响应状态代码为5xx(错误响应)。客户端库将根据返回的响应的状态代码确定是执行成功回调还是错误回调。

下面的代码应该完全工作。

protected override void OnException(ExceptionContext filterContext) 
{ 
    if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     filterContext.Result = new JsonResult 
     { 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
      Data = new { Error = true, Msj = filterContext.Exception.Message } 
     }; 
     filterContext.HttpContext.Response.StatusCode = 500; 
     filterContext.ExceptionHandled = true; 
    } 
} 
+0

我已经做到了。问题是.Net替换了'Data'属性 – Ayorus