我HandleErrorAttribute
通过创建自己的属性来处理 Ajax 请求期间引发的异常,从而在 MVC 中进行了扩展。该属性在这里:
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
类中的代码运行了两次,大概是因为它是全局注册的,而且它也在方法上。有没有办法阻止它运行两次?
谢谢。