I am implementing a custom credit check filter for a controller action. I use Ninject as my Ioc container. First, create a action filter and implement IActionFilter interface, implement the OnActionExecuted() and OnActionExecuting() methods. Within the credit checking functions, it needs a CreditService to check against the repository and database. So I have created the parameterized constructor using Ninject to inject the CreditService object.
public class CreditCheckFilter : IActionFilter { private ICreditService _creditService { get; set; } public CreditCheckFilter(ICreditService myService) { _creditService = myService; } public void OnActionExecuted(ActionExecutedContext filterContext) { } public void OnActionExecuting(ActionExecutingContext filterContext) { var userName = filterContext.HttpContext.User.Identity.Name; var bal = _creditService.GetTokenBalance(WebSecurity.GetUserId(userName)); if (bal <= 0) { RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); redirectTargetDictionary.Add("action", "GetTokens"); redirectTargetDictionary.Add("controller", "Account"); filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); } } }
Now Let’s create a CreditCheckAttribute that implements FilterAttribute, this is the attribute we put against the controller action,
public class CreditCheckAttribute : FilterAttribute { }
Now, we need to use Ninject BindFilter() method to bind our CreditCheckFilter, when a controller action has the attribute CreditCheckAttribute. In the ninject kernel, do this,
kernel.BindFilter(FilterScope.Action, 0).WhenActionMethodHas();
The last step is to put CreditCheckAttribute() against the controller action,
[CreditCheckAttribute] public ActionResult Playlist(TestViewModel model) { return View(model); }