C# ASP.NET MVC ActionFilter
有人知道ActionFilterAttribute类中的OnResultExecuted方法是否在CATCH块中执行吗 即: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();
我不明白为什么不会。你正在接受这个错误 接球回来感觉脏兮兮的。您可以在不放弃捕获的情况下实现相同的目标:
[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");
}
}