2011-01-24 57 views
2

我有一个控制器与一系列返回jsonp的动作。我的问题是,启用自定义错误,当有一个硬服务器错误时,我的jQuery Ajax调用不会“错误”。所以,我需要为控制器禁用自定义错误重定向,或者如果必须,则针对该控制器中的每个操作禁用自定义错误重定向。ASP.NET MVC 2.0 - 禁用控制器/动作的自定义错误重定向

有没有什么办法可以在错误只发生在那些动作上时禁用重定向,但仍然向客户端返回一个错误代码,以便ajax可以处理错误?

编辑:

我会用一些代码扩展。首先,我正在使用自定义错误的配置。

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/ServerError"> 
    <error statusCode="403" redirect="~/Error/AccessDenied" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
    <error statusCode="500" redirect="~/Error/ServerError" /> 
    <error statusCode="999" redirect="~/Error/ServerError" /> 
</customErrors> 

然后,我有我自己的异常报告属性。该属性应用于实现IController的基础控制器类。我的所有控制器都从这个基本控制器继承,所以在出现服务器错误时,它们都会生成内置的错误报告。

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 
     RaiseErrorSignal(context.Exception); 
    } 

    private static void RaiseErrorSignal(Exception ex) 
    { 
     IExceptionHandler handler = Resolve(); 

     handler.HandleError(ex.GetBaseException()); 
    } 

    private static IExceptionHandler Resolve() 
    { 
     return ServiceLocator.Locate<IExceptionHandler>(); 

    } 
} 

而且我有这样的

public JsonpResult DoSomething(string sessionId /*...more params...*/) 
{ 
    //Do work 

    return new JsonpResult() { Data = new { } }; 
} 

方法仅此控制器控制器/这些行动,我要禁用重定向,以便错误代码返回给客户端。错误仍然需要抛出,但不知怎的,自定义错误模式只需要将此请求更改为关闭,并且仅限于请求的持续时间。

+0

您使用的是[HandleErrorAttribute ](http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx),或者它只是标准的ASP.NET``元素在你的配置? – 2011-01-24 17:42:06

+0

这是标准的自定义错误。我写了自己的异常处理程序,它只是简单地向我发送服务器错误,然后继续允许应用程序执行内置重定向。我希望有一种方法可以编写一个属性,以编程方式禁用每个请求的自定义错误并将其附加到控制器。 – Josh 2011-01-24 17:50:10

+0

是否要为特定控制器/操作或特定操作类型(ajax方法)禁用它? – frennky 2011-01-24 20:32:06

回答

1

如果这些Ajax调用,你可以尝试这样的事:

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      base.OnException(context); 
      RaiseErrorSignal(context.Exception); 
     } 
     else 
     { 
      //Respond to ajax call with error message 
     } 
    } 
    //... 
} 
3

我带着由@frennky提供和它扩大一点答案。我正在设置HTTP响应代码,并让jQuery端的错误处理程序处理它。

在我的情况下,我正在使用遗留的webforms应用程序进行集成,该应用程序使用ASP.NET自定义错误页面来捕获我的所有错误。所有的疑问都被吞噬了,而且jQuery AJAX调用似乎正常完成。自定义错误页面的HTML被返回给我的jQuery AJAX成功函数。我想要一种方法来利用jQuery提供的错误处理。这种方法实现了这一目标。

这里是我的自定义HandleErrorAttribute:

public class HandleAjaxErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      base.OnException(filterContext); 
      return; 
     } 
     else 
     { 
      //Log the error here. 
      filterContext.ExceptionHandled = true; 
      filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; 
      filterContext.HttpContext.Response.StatusDescription = filterContext.Exception.Message; 
     } 
    } 
} 

下面是当jQuery的AJAX请求失败时调用我的JavaScript函数(简化这个例子):

function HandleAjaxError(jqXHR, textStatus, errorThrown) { 
    alert(jqXHR.statusText); 
} 
相关问题