Asp.Net Mvc Action Filters Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of ASP.NET MVC Action Filters

ASP.NET MVC Action Filters: Understanding and Implementation

ASP.NET MVC (Model-View-Controller) is a framework designed to build web applications efficiently through a clear separation of concerns. One of the core components in ASP.NET MVC that allows you to perform pre-processing or post-processing logic around an action method is the Action Filter. Action Filters are attributes that can be applied to individual action methods or controllers to define additional behaviors such as logging, authorization, and more, all in a centralized manner.

Understanding Action Filters

When a request comes to an ASP.NET MVC application, it first passes through a series of filters including Action Filters. These filters execute specific logic before and after an action method is executed, without adding any additional logic within the action method itself. This decoupling promotes cleaner code, enhances maintainability, and increases reusability.

Types of Action Filters

  1. IActionFilter

    • OnActionExecuting: This method is invoked before the action method is executed. You can perform tasks such as modifying action parameters, logging, or even canceling the action execution.
    • OnActionExecuted: This method is invoked after the action method has been executed but before the result (view) is rendered. You can manipulate the result object or log additional information.
  2. IResultFilter

    • OnResultExecuting: This method is invoked just before the action result (View or JSON etc.) is executed. Useful for altering the result or performing last-minute manipulations.
    • OnResultExecuted: This method is invoked after the action result execution is complete. Common use cases include releasing resources or logging.
  3. Authorization Filters

    • These are a specific type of action filter used for authentication and authorization purposes. They derive from the System.Web.Mvc.AuthorizeAttribute class. The primary methods are:
      • OnAuthorization: This method checks whether the user is authorized to access the action method or not. If the user is not authorized, it can redirect them to a login page or show an access denied message.
  4. Exception Filters

    • Also related but separate from Action Filters, Exception Filters allow you to catch and handle exceptions globally or at the controller or action level. Key Interface:
      • IExceptionFilter: Has OnException method which is invoked when an unhandled exception occurs. Can be used for logging errors, redirecting to error pages, etc.

Implementing Custom Action Filters

Implementing custom action filters is straightforward. You can either implement the IActionFilter or derive from ActionFilterAttribute if you are working within the ASP.NET MVC framework.

Step-by-Step Guide

  1. Create the Action Filter:

    public class LogActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Code to execute before the action method
            // For example, logging request data
            var logMsg = $"Action Executing: {filterContext.ActionDescriptor.ActionName}";
            // Log to file, database, or other logging mechanisms
            Debug.WriteLine(logMsg);
        }
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            // Code to execute after the action method
            // For example, logging response data or result manipulation
            var logMsg = $"Action Executed: {filterContext.ActionDescriptor.ActionName}";
            Debug.WriteLine(logMsg);
            if (filterContext.Result is HttpNotFoundResult notFound)
            {
                // Handle a 404 error specifically
                Debug.WriteLine("Handling HttpNotFoundResult");
            }
        }
    }
    
  2. Apply the Action Filter:

    • On Controller Level:
      [LogActionFilter]
      public class HomeController : Controller
      {
          public ActionResult Index()
          {
              return View();
          }
      }
      
    • On Action Method Level:
      public class HomeController : Controller
      {
          [LogActionFilter]
          public ActionResult Index()
          {
              return View();
          }
      
          public ActionResult About()
          {
              return View();
          }
      }
      
  3. Global Application of Action Filters: If you want the filter to apply to all action methods in your application, you can register it globally in the Global.asax.cs file.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement ASP.NET MVC Action Filters

Below is a complete step-by-step example for beginners to understand how to work with Action Filters in ASP.NET MVC.

Step 1: Create an ASP.NET MVC Project

  1. Open Visual Studio.
  2. Click on Create a new project.
  3. Select ASP.NET Web Application (.NET Framework) and click Next.
  4. Name your project ActionFiltersExample and click Create.
  5. In the next screen, choose MVC and make sure Authentication is set to No Authentication. Click Create.

Step 2: Create a Simple Controller

Let's create a simple HomeController with two actions: Index() and About().

  1. Go to the Controllers folder and right-click.
  2. Select Add > Controller.
  3. Choose MVC 5 Controller - Empty and name it HomeController.cs. Click Add.

Now add the following code inside HomeController.cs:

using System.Web.Mvc;

namespace ActionFiltersExample.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to the Index Page";
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Welcome to the About Page";
            return View();
        }
    }
}

Step 3: Create Views for the Controller Actions

For simplicity, let's create basic views for both actions.

  1. Go to the Views/Home folder (if it doesn't exist, just create it).
  2. Right-click in the Home folder and select Add > View.
  3. Name the view Index, leave the template as empty, and click Add.
  4. Add the following code inside Index.cshtml:
@{
    ViewBag.Title = "Index";
}

<h2>@ViewBag.Message</h2>
<p>This is the Index Action.</p>
  1. Repeat steps 2-4 to create another view named About with the following content:
@{
    ViewBag.Title = "About";
}

<h2>@ViewBag.Message</h2>
<p>This is the About Action.</p>

Step 4: Create a Custom Action Filter

Now, let's create a custom action filter that logs messages before and after each action is executed.

  1. Right-click on the ActionFiltersExample project and add a new folder named Filters.
  2. Inside the Filters folder, right-click and select Add > Class.
  3. Name the class LoggingActionFilter.cs and click Add.

Here is the implementation of the LoggingActionFilter:

using System;
using System.Diagnostics;
using System.Web.Mvc;

namespace ActionFiltersExample.Filters
{
    public class LoggingActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Debug.WriteLine($"OnActionExecuting: {filterContext.ActionDescriptor.ActionName} action is about to be executed.");
            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Debug.WriteLine($"OnActionExecuted: {filterContext.ActionDescriptor.ActionName} action has been executed.");
            base.OnActionExecuted(filterContext);
        }
    }
}

Step 5: Apply the Custom Action Filter to a Controller

Let's apply our custom action filter to the HomeController.

  1. Open HomeController.cs.
  2. Add the [LoggingActionFilter] attribute above the HomeController class declaration to enable it for all actions within the controller:
using ActionFiltersExample.Filters;
using System.Web.Mvc;

namespace ActionFiltersExample.Controllers
{
    [LoggingActionFilter]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to the Index Page";
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Welcome to the About Page";
            return View();
        }
    }
}

Alternatively, you can apply the filter to specific actions only:

using ActionFiltersExample.Filters;
using System.Web.Mvc;

namespace ActionFiltersExample.Controllers
{
    public class HomeController : Controller
    {
        [LoggingActionFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to the Index Page";
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Welcome to the About Page";
            return View();
        }
    }
}

Step 6: Register Global Filters (Optional)

If you want to apply this filter globally across all controllers and actions, you can register it in the GlobalFilters collection.

  1. Open Global.asax file.
  2. Add the following line inside the Application_Start() method to register our custom filter:

Top 10 Interview Questions & Answers on ASP.NET MVC Action Filters

Top 10 Questions and Answers on ASP.NET MVC Action Filters

1. What are Action Filters in ASP.NET MVC?

2. What is the difference between OnActionExecuting and OnActionExecuted methods?

Answer: In an Action Filter, OnActionExecuting is called before the action method is invoked, and OnActionExecuted is called after the action method has executed. OnActionExecuting can be used for any pre-processing and can even cancel the action execution. OnActionExecuted is useful for post-processing, such as clean-up or logging the action results.

3. How do you implement a custom Action Filter in ASP.NET MVC?

Answer: To implement a custom Action Filter, you need to create a class that inherits from ActionFilterAttribute and override the OnActionExecuting or OnActionExecuted methods. Here’s a simple example:

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Code to run before the action handler
        Debug.WriteLine("OnActionExecuting called");
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // Code to run after the action handler
        Debug.WriteLine("OnActionExecuted called");
        base.OnActionExecuted(filterContext);
    }
}

You can then apply this filter to a controller or specific action method using an attribute:

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

4. How can you apply an Action Filter globally in ASP.NET MVC?

Answer: To apply an Action Filter globally, you can register it in the Global.asax file's Application_Start method using the GlobalFilters collection:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalFilters.Filters.Add(new CustomActionFilter());
        // Other configurations here
    }
}

5. Can Action Filters access and modify action parameters?

Answer: Yes, within the OnActionExecuting method, you can access and modify action parameters via the ActionExecutingContext.ActionParameters dictionary. You can also cancel the action execution by setting filterContext.Result to an appropriate result like HttpStatusCodeResult or RedirectResult.

6. What are the benefits of using Action Filters?

Answer: The primary benefits of using Action Filters include:

  • Reusability: Defines behavior in a reusable way across controllers or actions.
  • Separation of Concerns: Keeps business logic separate from cross-cutting concerns.
  • Centralized Execution: Provides a centralized place to execute code before and after actions.

7. Can Action Filters be used for security checks?

Answer: While Action Filters are not intended for complex authentication and authorization checks, they can be used for simpler scenarios like basic validation and access control. For more robust security checks, consider using built-in authentication and authorization mechanisms like [Authorize] attributes or custom authorization filters.

8. How can you pass data from an Action Filter to the action method?

Answer: You can pass data from an Action Filter to an action method by adding data to the ActionExecutingContext.Controllers.ViewData or ActionExecutingContext.Controllers.TempData collections or by using other context data bags like ActionExecutingContext.Filters or ActionExecutingContext.HttpContext.Items.

9. Are there any performance considerations when using Action Filters?

Answer: Yes, Action Filters can impact performance because they execute additional code before and after the action methods. It's important to ensure that the code in these filters is as efficient as possible and only used when necessary. Excessive logging, complex calculations, or database operations should be avoided.

10. How do you handle exceptions in an Action Filter?

Answer: Exception handling can be done in the OnActionExecuted method by checking filterContext.Exception. You can log the exception, set a custom error result, and optionally set filterContext.ExceptionHandled to true to indicate that the exception has been handled:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    if (filterContext.Exception != null)
    {
        // Handle exception
        Debug.WriteLine("Exception handled in OnActionExecuted");
        filterContext.ExceptionHandled = true;
        filterContext.Result = new ContentResult { Content = "An error occurred." };
    }
    base.OnActionExecuted(filterContext);
}

However, for more complex exception handling, consider using exception handling filters like HandleErrorAttribute or custom error handling middleware.


You May Like This Related .NET Topic

Login to post a comment.