How to pass parameters to a custom ActionFilter in ASP.NET MVC 2?

后端 未结 3 1840
一向
一向 2020-12-01 01:13

I\'m trying to create a custom ActionFilter which operates on a set of parameters that would be passed to it from the controller.

So far, my customer ActionFilter lo

3条回答
  •  心在旅途
    2020-12-01 01:24

    This is a way to make this work. You have access to the ControllerContext and therefore Controller from the ActionFilter object. All you need to do is cast your controller to the type and you can access any public members.

    Given this controller:

    public GenesisController : Controller
    {
        [CheckLoggedIn()]
        public ActionResult Home(MemberData md)
        {
            return View(md);
        }
    }
    

    ActionFilter looks something like

    public class CheckLoggedIn : ActionFilterAttribute
    {
        public IGenesisRepository gr { get; set; }
        public Guid memberGuid { get; set; }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            /* how to get the controller*/
            var controllerUsingThisAttribute = ((GenesisController)filterContext.Controller);
    
            /* now you can use the public properties from the controller */
            gr = controllerUsingThisAttribute .genesisRepository;
            memberGuid = (controllerUsingThisAttribute .memberGuid;
    
            Member thisMember = gr.GetActiveMember(memberGuid);
            Member bottomMember = gr.GetMemberOnBottom();
    
            if (thisMember.Role.Tier <= bottomMember.Role.Tier)
            {
                filterContext
                    .HttpContext
                    .Response
                    .RedirectToRoute(new { controller = "Member", action = "Login" });
            }
    
            base.OnActionExecuting(filterContext);
        }
    }
    

    Of course this is assuming the ActionFilter isn't used across multiple controllers and you're ok with the coupling. Another Option is to make a ICheckedLoggedInController interface with the shared properties and simply cast to that instead.

提交回复
热议问题