首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性的OnActionExecuted方法总是执行的吗?

属性的OnActionExecuted方法总是执行的吗?
EN

Stack Overflow用户
提问于 2009-10-30 22:26:27
回答 1查看 6.3K关注 0票数 13

我到处找,似乎找不到一个直接的答案。

如果我有一个自定义的属性/过滤器,OnActionExecuted方法会一直被调用吗?即使抛出了异常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-05 21:29:06

至少在MVC 5中,@tvanfosson的答案不再正确。这可能也适用于较早的版本。

OnActionExecuted总是被调用,并且可以通过filterContext.Exception访问抛出的异常。

在操作中出现异常的测试用例:

代码语言:javascript
复制
public class HomeController
    : Controller
{
    public ActionResult Index()
    {
        throw new Exception("Index");
    }
}

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new Foo());
        filters.Add(new Bar());
    }
}

public class Foo
    : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}");
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}");
        Debug.WriteLine($"Has exception: {filterContext.Exception != null}");
        base.OnActionExecuted(filterContext);
    }
}

public class Bar
    : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}");
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}");
        Debug.WriteLine($"Has exception: {filterContext.Exception != null}");
        base.OnActionExecuted(filterContext);
    }
}

输出:

代码语言:javascript
复制
Bar.OnActionExecuting
Foo.OnActionExecuting
Exception thrown: 'System.Exception' in WebApplication1.dll
Foo.OnActionExecuted
Has exception: True
Bar.OnActionExecuted
Has exception: True

筛选器中出现异常的测试用例

代码语言:javascript
复制
public class HomeController
    : Controller
{
    public ActionResult Index()
    {
        return new HttpStatusCodeResult(200);
    }
}

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new Foo());
        filters.Add(new Bar());
    }
}

public class Foo
    : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}");
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}");
        Debug.WriteLine($"Has exception: {filterContext.Exception != null}");
        throw new Exception("Foo");
        base.OnActionExecuted(filterContext);
    }
}

public class Bar
    : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}");
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}");
        Debug.WriteLine($"Has exception: {filterContext.Exception != null}");
        base.OnActionExecuted(filterContext);
    }
}

输出:

代码语言:javascript
复制
Bar.OnActionExecuting
Foo.OnActionExecuting
Foo.OnActionExecuted
Has exception: False
Exception thrown: 'System.Exception' in WebApplication1.dll
Bar.OnActionExecuted
Has exception: True
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1650108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档