Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC ActionFilter_C#_Asp.net_Asp.net Mvc_Action Filter - Fatal编程技术网

C# ASP.NET MVC ActionFilter

C# ASP.NET MVC ActionFilter,c#,asp.net,asp.net-mvc,action-filter,C#,Asp.net,Asp.net Mvc,Action Filter,有人知道ActionFilterAttribute类中的OnResultExecuted方法是否在CATCH块中执行吗 即: 我不明白为什么不会。你正在接受这个错误 接球回来感觉脏兮兮的。您可以在不放弃捕获的情况下实现相同的目标: [CookiesActions] public ActionResult Login(Usuarios usuario) { [...] Usuarios usarios = new Usuarios();

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

即:


我不明白为什么不会。你正在接受这个错误

接球回来感觉脏兮兮的。您可以在不放弃捕获的情况下实现相同的目标:

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

           Usuarios usarios = new Usuarios();

           try
           {
             ...
             usarios = sceUsuarios.Usuario;

            }
            catch  { /*swallow error*/ }

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

           [...]

    }

简而言之:

您可以通过一个简单的日志操作过滤器来验证这一点

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被写入调试,即使在您接受异常时也是如此。

我不能这样做,因为我只想在没有异常发生的情况下执行OnResultExecuted逻辑。您可以在HttpContext.Items集合中存储标志。在接球时你可以设置旗子。在针对标志的OnResultExecuted检查中。。。这有点麻烦。。。但这是可行的。这个答案直接来自微软文档。LogAttribute片段可能是从文档中复制的(我不记得了),但答案不是。此代码用于演示用户问题的答案,即OnResultExecuted方法甚至从catch块内部调用。
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");
    }

}