Search code examples
asp.net-mvcasp.net-mvc-3ninjectaction-filter

Help with action filters in asp.net mvc 3


I want to create an action filter that will be used by ONLY two controllers in my app... This action filter is supposed to be checked for every action inside the TWO controllers.

Heres my action filter code

public class AllowedToEditEHRFilter : IActionFilter
    {
        IUnitOfWork unitOfWork;
        IRepository<EHR> ehrRepository;
        public AllowedToEditEHRFilter(IUnitOfWork dependency)
        {
            unitOfWork = dependency;
            ehrRepository = unitOfWork.EHRs;
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            int ehrId;
            if (int.TryParse(filterContext.HttpContext.Request.QueryString["ehrId"], out ehrId))
            {
                EHR ehr = ehrRepository.FindById(ehrId);
                if (ehr.UserName != Membership.GetUser().UserName)
                    filterContext.Result = new ViewResult { ViewName = "InvalidOwner" };
            }
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }
    }

Now Im just not sure how can I configure MVC framework so that the action filter gets triggered at the appropriate times.

Im using this as reference but that is applying a GLOBAL actionfilter and it doesnt specify how to limit to just some of your controllers.

Please help.

btw Im using NinjectMVC3


Solution

  • This depends on what the appropriate time is.

    See my original blog post

    Or read the other pages of the doc:

    (Probably I should link them)

    Basically you need to configure a binding for the filter and define some condition:

    kernel.BindFilter<AllowedToEditEHRFilter>(FilterScope.Action, 0).When...
    

    e.g.

    .WhenActionHas<AllowedToEditEHRAttribute>()
    

    Update: In your case simply

    kernel.BindFilter<AllowedToEditEHRFilter>(FilterScope.Controller, 0).When(
        (controllerContext, actionDescriptor) =>  
         controllerContext.Controller is PhysicalTestsController)