ASP.NET MVC ActionFilter - PullRequest
       8

ASP.NET MVC ActionFilter

2 голосов
/ 26 августа 2010

Кто-нибудь знает, выполняется ли метод OnResultExecuted из класса ActionFilterAttribute даже в блоке 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?
            }
[...]

Ответы [ 2 ]

10 голосов
/ 26 августа 2010

Короче говоря: ДА .

Вы можете проверить это с помощью простого фильтра действий журналирования.

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 голосов
/ 26 августа 2010

Я не понимаю, почему это не так. Вы глотаете ошибку.

Возвращение из улова кажется грязным. Вы можете достичь того же, не возвращаясь с уловкой:

   [CookiesActions]
    public ActionResult Login(Usuarios usuario)
    {
     [...]

           Usuarios usarios = new Usuarios();

           try
           {
             ...
             usarios = sceUsuarios.Usuario;

            }
            catch  { /*swallow error*/ }

            return View(new UsersViewModel(usarios ,true));

           [...]

    }
...