Ajax 如何将已经是全局筛选器的属性应用于方法,而不使其运行两次?

Ajax 如何将已经是全局筛选器的属性应用于方法,而不使其运行两次?,ajax,asp.net-mvc,asp.net-mvc-3,attributes,handleerror,Ajax,Asp.net Mvc,Asp.net Mvc 3,Attributes,Handleerror,通过创建自己的属性来处理Ajax请求期间引发的异常,我在MVC中扩展了HandleErrorAttribute。该属性如下所示: public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute { public string PartialViewName { get; set; } public override void OnException(ExceptionContext filterContext)

通过创建自己的属性来处理Ajax请求期间引发的异常,我在MVC中扩展了
HandleErrorAttribute
。该属性如下所示:

public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute
{
    public string PartialViewName { get; set; }

    public override void OnException(ExceptionContext filterContext)
    {
        ExceptionHelper.HandleException(filterContext.Exception, false); // custom static class and method
        base.OnException(filterContext);

        // Use partial view in case of AJAX request
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = new PartialViewResult {ViewName = PartialViewName ?? "~/Views/Errors/DefaultAjaxError.cshtml"};
            filterContext.Result = result;
        }
    }
}
如您所见,当
PartialViewName
为null时,存在默认行为。这是因为我在global.asax文件中将其注册为全局过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AjaxAwareHandleErrorAttribute());
}
因此,按照这种设置方式,在Ajax调用期间引发异常时,我有默认行为,即将返回DefaultAjaxError.cshtml。在需要自定义消息的情况下,我会创建一个视图,并将其作为
PartialViewName
直接传递给操作上的属性,如下所示:

[AjaxAwareHandleError(PartialViewName = "~/Views/Errors/CustomAjaxError.cshtml")]
public ActionResult SomeAjaxControllerAction()
如果我使用控制器操作装饰控制器,那么问题在于
AjaxAwareHandleErrorAttribute
类中的代码运行了两次,可能是因为它是全局注册的,也可能是因为它在方法上。有什么方法可以防止它运行两次吗


谢谢。

filterContext.ExceptionHandled
属性设置为true


然后,在覆盖的顶部,检查该属性是否为真,并立即返回。

Perfect,适用于我。然而,就我所知,我仍然很好奇是否有一种方法可以防止一个属性运行两次,而这不一定会处理异常。@MattPowell:您可以在
HttpContext.Items
中存储一个标志。