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