Asp.net mvc 如何在ActionExecutedContext上设置ExceptionHandled

Asp.net mvc 如何在ActionExecutedContext上设置ExceptionHandled,asp.net-mvc,action-filter,Asp.net Mvc,Action Filter,我在操作方法上使用了ActionFilter(我没有编写)。action方法本身调用存储库上的SaveOrUpdate()方法。如果SaveOrUpdate()方法因异常而失败,我希望在action方法中设置ActionExecutedContext的ExceptionHandled属性,以便OnActionExecuted方法不会尝试提交事务 我该怎么做?这是正确的方法还是我应该以不同的方式来做 以下是筛选器的OnActionExecuted中的代码: public void OnActio

我在操作方法上使用了ActionFilter(我没有编写)。action方法本身调用存储库上的SaveOrUpdate()方法。如果SaveOrUpdate()方法因异常而失败,我希望在action方法中设置ActionExecutedContext的ExceptionHandled属性,以便OnActionExecuted方法不会尝试提交事务

我该怎么做?这是正确的方法还是我应该以不同的方式来做

以下是筛选器的OnActionExecuted中的代码:

public  void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var thereWereNoExceptions = filterContext.Exception == null || filterContext.ExceptionHandled;
        if (filterContext.Controller.ViewData.ModelState.IsValid && thereWereNoExceptions)
        {
            _transaction.Commit();
        }
        else
        {
            _transaction.Rollback();
        }
    }

你不需要这样做。只需抛出一个异常:

[MyFilter]
public ActionResult Index()
{
    throw new Exception("foo");
}

您的
OnActionExecuted
过滤器的
else
语句将被点击并回滚事务。

以下是我用来处理自定义错误的代码

filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

嗯,action方法引发的异常是我如何首先发现问题的。最后,我决定捕获异常并添加一个ModelState错误。else语句随后生效,因为它测试ModelState.IsValid是否有效。@Simon,这很奇怪。我无法重现这种行为。我编写了一个来自
actionfilteratAttribute
的自定义操作过滤器属性,并通过放置与您案例中完全相同的测试来覆盖
OnActionExecuted
。然后,我用这个自定义属性修饰控制器操作,当控制器操作中抛出异常时,执行
else
语句。你的情况和我的有什么不同?您的操作属性是从
ActionFilterAttribute
派生出来的,还是您只是在实现
IActionFilter
接口?