1

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类中的代码运行了两次,大概是因为它是全局注册的,而且它也在方法上。有没有办法阻止它运行两次?

谢谢。

4

1 回答 1

0

filterContext.ExceptionHandled属性设置为 true。

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

于 2013-02-15T19:40:05.073 回答