Ajax 如何将已经是全局筛选器的属性应用于方法,而不使其运行两次?
通过创建自己的属性来处理Ajax请求期间引发的异常,我在MVC中扩展了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)
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
中存储一个标志。