【问题标题】:ASP.NET MVC ActionFilterASP.NET MVC 动作过滤器
【发布时间】:2010-08-25 20:16:38
【问题描述】:

有人知道ActionFilterAttribute 类的OnResultExecuted 方法是否在CATCH 块中执行?

即:

        [CookiesActions]
        public ActionResult Login(Usuarios usuario)
[...]
            return View(new UsersViewModel(sceUsuarios.Usuario,true));
            }
            catch
            {
                return View(new UsersViewModel(new Usuarios(),true));//is OnResultExecuted fired here?
            }
[...]

【问题讨论】:

    标签: c# asp.net asp.net-mvc action-filter


    【解决方案1】:

    简而言之:

    您可以使用一个简单的日志记录操作过滤器来验证这一点。

    public class LogAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Log("OnActionExecuting", filterContext.RouteData);
        }
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Log("OnActionExecuted", filterContext.RouteData);
        }
    
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Log("OnResultExecuting", filterContext.RouteData);
        }
    
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Log("OnResultExecuted", filterContext.RouteData);
        }
    
    
        private void Log(string methodName, RouteData routeData)
        {
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];
            var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
            Debug.WriteLine(message, "Action Filter Log");
        }
    
    }
    

    如果您将 [Log] 属性放在您的方法上,您会看到 OnResultExecuted 被写入调试,即使您吞下了异常。

    【讨论】:

    【解决方案2】:

    我不明白为什么它不会。你正在吞下错误。

    从捕获中返回感觉很脏。您可以实现同样的目标,而无需退出捕获:

       [CookiesActions]
        public ActionResult Login(Usuarios usuario)
        {
         [...]
    
               Usuarios usarios = new Usuarios();
    
               try
               {
                 ...
                 usarios = sceUsuarios.Usuario;
    
                }
                catch  { /*swallow error*/ }
    
                return View(new UsersViewModel(usarios ,true));
    
               [...]
    
        }
    

    【讨论】:

    • 我不能这样做,因为我只想在没有异常发生的情况下执行 OnResultExecuted 逻辑
    • 您可以在 HttpContext.Items 集合中存储一个标志。在捕获中,您可以设置标志。在 OnResultExecuted 检查标志...这有点笨拙...但它会工作。
    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多