【问题标题】:ASP MVC ActionFilterAttribute OnActionExecuting not firedASP MVC ActionFilterAttribute OnActionExecuting 未触发
【发布时间】:2015-09-13 09:21:36
【问题描述】:

我有 2 个控制器 Home

public class HomeController : Controller
    {
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                // do some irrelevant stuff
                    base.OnActionExecuting(filterContext);           

            }

    public ActionResult Index()
            {            
                    return View();
            }
}

Service 一起

public ActionResult Confirm()
            { return RedirectToAction("Index", "Home");}

还有一个ActionFilterAttributeOnActionExecuting 方法

 public class InvitationModeAttribute : ActionFilterAttribute
    {
     public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
               // do some stuff

                base.OnActionExecuting(filterContext);
            }
}

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {            
            filters.Add(new InvitationModeAttribute());
        }
    }

当我转到 localhost/Service/Confirm 时,OnActionExecuting 会被触发,但是当RedirectToAction 被调用时,OnActionExecuting 不会被触发。 在RedirectToAction 之后我该如何捕捉到这个?

谢谢

【问题讨论】:

  • 显示两个控制器的代码。
  • 已编辑...关键是在 RedirectToAction 之后不会触发 OnActionExecuting
  • 你的 OnActionExecuting 方法是在哪里写的?
  • @Maarty 我没有看到属性。你是否用期望的属性装饰了这两个动作?
  • @SillyVolley - 已编辑

标签: c# asp.net asp.net-mvc redirecttoaction actionfilterattribute


【解决方案1】:

请参阅this 了解更多信息

首先 移除控制器级别的 OnActionExecuting 方法

public class HomeController : Controller
{
       [InvitationModeAttribute]
     public ActionResult Index()
     {            
        return View();
     }
 }

第二控制器

 public class ServiceController : Controller
 {
   [InvitationModeAttribute]
   public ActionResult Confirm()
   { 
     return RedirectToAction("Index", "Home");
   }
 }

来自 MSDN

作用范围过滤器

除了用动作标记单个动作方法 过滤器,你可以用一个动作将一个控制器类标记为一个整体 筛选。在这种情况下,过滤器适用于该过滤器的所有操作方法 控制器。此外,如果您的控制器来自另一个 控制器,基本控制器可能有自己的动作过滤器 属性。同样,如果您的控制器覆盖了一个操作方法 从基本控制器,该方法可能有自己的动作过滤器 属性以及它从重写的操作方法继承的属性。到 更容易理解动作过滤器如何协同工作,动作 方法被分组到范围中。范围定义属性的位置 适用,比如它是否标记了一个类或一个方法,以及它是否 标记基类或派生类。

【讨论】:

  • 谢谢。那么它的工作原理。但这不是我想要的。无论如何我肯定做错了方法。我需要在 HomeController 中知道它是从服务控制器重定向的。我希望它用于那里的所有方法,所以我不想为每个重定向使用任何 cookie 或参数。有什么办法吗?
  • 恐怕你做不到 AFAIK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多