Asp.Net Mvc Creating Custom Filters Complete Guide

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

Understanding the Core Concepts of ASP.NET MVC Creating Custom Filters

Understanding ASP.NET MVC Filters

Filters in ASP.NET MVC are attributes that allow you to run specific logic before or after the controller action method or the result of an action is executed. They come in four types:

  1. Authorization Filters: Execute code before and after authorization occurs (for instance, checking if the user is authenticated or has a certain role).
  2. Action Filters: Execute code before and after an action method is invoked.
  3. Result Filters: Execute code before and after the view (or view component) is rendered.
  4. Exception Filters: Handle unhandled exceptions that occur anywhere in the MVC request pipeline.

Creating Custom Action Filter

Custom action filters are a bit more common as they allow us to execute custom logic around action execution.

Step-by-Step Guide:

1. Create a New Class: Begin by creating a new class that derives from ActionFilterAttribute. This is your custom filter class.

using System.Web.Mvc;

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

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // Code to run after the action executes
        base.OnActionExecuted(filterContext);
    }
}

2. Override Methods:

  • OnActionExecuting: This method is called before an action method. It’s a good place to validate data, check permissions, or perform logging.
  • OnActionExecuted: This method is called after an action method completes but before the result (e.g., View) is executed.

3. Apply the Custom Filter to Actions or Controllers: Use the [CustomActionFilter] attribute on controllers or actions where you want the custom filter applied.

public class MyController : Controller
{
    [CustomActionFilter]
    public ActionResult MyAction()
    {
        return View();
    }
}

Important Properties and Contexts

ActionExecutingContext:

  • Controller: Reference to the controller where an action is being filtered.
  • ActionDescriptor: Information about the action method being called.
  • Result: Set this property to a specific ActionResult if you need to short-circuit the action method (e.g., redirect to a different page).

ActionExecutedContext:

  • Controller: The same controller instance.
  • ActionDescriptor: Details about the action method.
  • Result: Allows you to modify the return value of the action method, which is useful if you need to alter the view or data returned by the action.

Creating Custom Authorization Filters

Custom authorization filters determine whether a request can access a particular resource or not.

Step-by-Step Guide:

1. Create a New Class: Create a custom authorization filter class derived from AuthorizeAttribute.

using System.Web.Mvc;

public class CustomAuthorizationFilter : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Custom authorization logic here
        return base.AuthorizeCore(httpContext);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // Custom handling when the request is unauthorized
        base.HandleUnauthorizedRequest(filterContext);
    }
}

2. Override Methods:

  • AuthorizeCore: Implement the necessary authorization logic here. Return true if authorized, otherwise false.
  • HandleUnauthorizedRequest: Define how to handle the response if authorization fails (e.g., redirect to a login page).

3. Apply the Custom Filter:

public class MyController : Controller
{
    [CustomAuthorizationFilter]
    public ActionResult MyAction()
    {
        return View();
    }
}

Important Properties and Contexts

AuthorizationContext:

  • HttpContext: Provides access to request, response, session, user, etc.
  • ActionDescriptor: Information about the action method.
  • Result: You can set this if you need to change how unauthenticated requests are handled.

Creating Custom Exception Filters

Exception filters are used to manage unhandled exceptions at various points in the MVC lifecycle.

Step-by-Step Guide:

1. Create a New Class: Create a class that inherits from ExceptionFilterAttribute.

using System.Web.Mvc;

public class CustomExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // Custom exception handling logic here
        base.OnException(filterContext);
    }
}

2. Override Methods:

  • OnException: Place your exception handling code here. Set filterContext.ExceptionHandled = true when you handle an exception to prevent it from propagating further.

3. Apply the Custom Filter:

public class MyController : Controller
{
    [CustomExceptionFilter]
    public ActionResult MyAction()
    {
        throw new Exception("Something went wrong!");
        return View();
    }
}

Important Properties and Contexts

ExceptionContext:

  • HttpContext: Provides access to HTTP context.
  • ActionDescriptor: Information about the action method.
  • ExceptionHandled: Set to true to indicate that the exception was handled.
  • Result: Set to a specific ActionResult like ViewResult, RedirectResult, etc., to control the response sent to the client.

Global Filters

You might want to apply your custom filters globally, rather than decorating them on each controller or action. To achieve this, register your filter in the Global.asax file.

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    // Register global filters
    GlobalFilters.Filters.Add(new CustomActionFilter());
    GlobalFilters.Filters.Add(new CustomAuthorizationFilter());
    GlobalFilters.Filters.Add(new CustomExceptionFilter());
}

Conclusion

Creating custom filters in ASP.NET MVC can help you implement cross-cutting concerns in your application efficiently. By overriding key methods and utilizing the provided contexts, you can add powerful functionalities to your application, such as custom authentication logic, error handling mechanisms, and performance logging.

Additional Resources

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 Creating Custom Filters

Step by Step Guide: Creating Custom Filters in ASP.NET MVC

Prerequisite:

  • Basic knowledge of ASP.NET MVC.
  • An existing ASP.NET MVC project (or you can create a new one).

Objective:

Create a custom authorization filter that checks if the current request comes from a specific IP address.

Step 1: Create a New ASP.NET MVC Project

If you don't have an existing project, create a new one:

  1. Open Visual Studio.
  2. Select File > New > Project.
  3. Choose ASP.NET Web Application and click Next.
  4. Enter the name of your project (e.g., MyMvcApp) and click Create.
  5. Select MVC template and click Create.

Step 2: Create a Custom Filter Class

Filters in ASP.NET MVC derive from a base class or implement a specific interface. Here, we'll create a custom authorization filter that inherits from AuthorizationFilterAttribute.

  1. Right-click on the project in the Solution Explorer and select Add > Class.
  2. Name the class IPAuthorizeAttribute.cs.
  3. In the class file, replace its content with the following code:
using System.Net;
using System.Web.Mvc;

public class IPAuthorizeAttribute : AuthorizationFilterAttribute
{
    // This is the IP address we authorize
    private string[] authorizedIPs = { "127.0.0.1" }; // example, change it as necessary

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException(nameof(filterContext));
        }

        // Get the user's IP address from the HTTP context
        IPAddress userIP = IPAddress.Parse(filterContext.HttpContext.Request.UserHostAddress);

        // Check if the user's IP address is in the list of authorized IPs
        bool isAuthorized = authorizedIPs.Any(ip => IPAddress.Parse(ip).Equals(userIP));

        if (!isAuthorized)
        {
            // If not authorized, send an unauthorized page.
            filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
        }
    }
}
  • The OnAuthorization method is overridden to perform the custom logic.
  • We check if the user's IP address matches the allowed IP addresses.
  • If not, we return an HttpStatusCodeResult with HttpStatusCode.Unauthorized.

Step 3: Register the Custom Filter

There are different ways to apply a filter in ASP.NET MVC:

  • Global: It applies to all controllers and actions.
  • Controller level: It applies only to specific controller.
  • Action level: It applies only to specific action.

We will show both global and controller-level examples.

Globally (for all controllers and actions):
  1. Open the Global.asax.cs file.
  2. Find the RegisterGlobalFilters method and add your custom filter like this:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new IPAuthorizeAttribute()); // Add your custom filter here
}
  1. Save the changes.
For a specific Controller:

Alternatively, suppose you want to apply the filter to a specific controller.

  1. Open any controller file, for example, HomeController.cs.
  2. Apply the custom filter using the IPAuthorizeAttribute attribute:
[IPAuthorize] // Apply custom IP authorization filter to this controller
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
}
  • Replace the HomeController.cs with your actual controller file.

Step 4: Test the Custom Filter

Now, let's test our custom filter:

  1. Run the project.
  2. Navigate to any controller action in your browser (e.g., http://localhost:5000/Home/Index).
  3. Since the localhost IP address (127.0.0.1) is authorized in the IPAuthorizeAttribute class, you should see the respective view page rendered without any issue.
  4. To test the unauthorized scenario, modify the authorizedIPs array to a different IP address that doesn’t match your current machine IP.
private string[] authorizedIPs = { "8.8.8.8" }; // Change this to an IP not matching your machine
  1. Re-run the project and try to navigate to any controller action. You should now be seeing the Unauthorized error page.

Conclusion:

In this example, we created a custom authorization filter called IPAuthorizeAttribute and applied it globally and to a specific controller. Custom filters are essential for cross-cutting concerns and help keep your application clean and maintainable.

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

Top 10 Questions and Answers: ASP.NET MVC Creating Custom Filters

1. What are Action Filters in ASP.NET MVC, and how do they differ from Result Filters?

2. How can I create a custom Authorization filter in ASP.NET MVC?

Answer: To create a custom Authorization filter, you need to inherit from AuthorizeAttribute and implement your own logic. Here's a basic example:

public class CustomAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Your authorization logic here
        return httpContext.User.Identity.IsAuthenticated && httpContext.User.IsInRole("Admin");
    }
    
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // Override to handle unauthorized access if necessary
        filterContext.Result = new RedirectResult("~/Home/UnAuthorized");
    }
}

You can then annotate your actions or controllers with [CustomAuthorize].

3. Can I use a custom filter to modify the data being passed to a view in ASP.NET MVC?

Answer: Yes, you can use a Result Filter to modify the data being passed to a view. By implementing IResultFilter, you can have access to both OnResultExecuting and OnResultExecuted methods.

public class ModifyViewDataFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            if (filterContext.Controller.ViewData["customValue"] == null)
                filterContext.Controller.ViewData["customValue"] = "Default Value";
        }
    }

    public void OnResultExecuted(ResultExecutedContext filterContext) { }
}

Register this filter globally or on specific actions/controllers.

4. How do I register a global custom filter in ASP.NET MVC?

Answer: You can register a global filter by adding it to the GlobalFilters collection in FiltersConfig.cs, which is typically found in the App_Start folder:

public class FiltersConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomAuthorize());
        filters.Add(new ModifyViewDataFilter());
        filters.Add(new ErrorHandler());
    }
}

Ensure the RegisterGlobalFilters method is called during application start in Global.asax.

5. What is the difference between OnActionExecuting and OnActionExecuted methods in Action Filters?

Answer: The OnActionExecuting method runs before the action method is invoked, providing an opportunity to modify the ActionExecutingContext such as the parameters to the action method. After the action method executes, OnActionExecuted runs, where you can modify the ActionExecutedContext, including the ActionResult returned by the action method. This is useful if you want to redirect the user based on some conditions or perform logging after the action completes.

6. How can I create a custom logging filter in ASP.NET MVC?

Answer: To create a custom logging filter using an Action Filter, you can log details like action name, parameters, and execution time:

public class LoggingFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Log request details
        Debug.WriteLine($"Action Executing: {filterContext.ActionDescriptor.ActionName}");
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // Log response details if needed
        Debug.WriteLine($"Action Executed: {filterContext.ActionDescriptor.ActionName}, Exec. Time: {filterContext.HttpContext.Timestamp}");
    }
}

Apply this filter at a global level, controller level, or action method level as appropriate.

7. How can I create a custom exception handling filter in ASP.NET MVC?

Answer: Utilize the ExceptionFilterAttribute to create a custom exception handler:

public class ErrorHandler : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // Handle exceptions
        Debug.WriteLine(filterContext.Exception.Message);
        
        filterContext.Result = new ViewResult
        {
            ViewName = "Error",
            ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
            {
                {"ErrorMessage", filterContext.Exception.Message}
            },
            TempData = filterContext.Controller.TempData
        };

        filterContext.ExceptionHandled = true;
    }
}

Remember to register your custom exception handler in FiltersConfig.cs.

8. Is it possible to create a custom filter that modifies the HTTP response directly?

Answer: Yes, you can do this by creating a Response Filter. Here’s a simple way using ActionFilter and modifying HttpResponse:

public class CustomResponseFilter : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        string content = filterContext.HttpContext.Response.Filter;
        using (var stream = new MemoryStream())
        {
            filterContext.HttpContext.Response.Filter = stream;
            filterContext.HttpContext.Response.Write(content + " - added text via filter.");
            stream.Position = 0;
            var reader = new StreamReader(stream);
            content = reader.ReadToEnd();
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.Write(content);
        }
    }
}

This filter appends text directly into the response stream after the result is executed.

9. How can I make a filter asynchronous in ASP.NET MVC?

Answer: In ASP.NET MVC 5 and later, you can make a filter asynchronous by using async methods. Here’s an example using an asynchronous Action Filter:

public class AsyncActionFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // Code to execute before the action
        Debug.WriteLine("Before Action Execution");

        var resultContext = await next();

        // Code to execute after the action
        Debug.WriteLine("After Action Execution");
    }
}

Make sure the filter attribute methods are async and that your project targets .NET Framework 4.5 or higher.

10. What are the best practices when creating custom filters in ASP.NET MVC?

Answer: When creating custom filters, consider these best practices:

  • Modularity: Keep filters modular; one filter should handle one concern.
  • Performance: Optimize performance by avoiding expensive operations inside filters.
  • Global Registration: Use global registration for common filters to keep code DRY.
  • Exception Handling: Implement proper exception handling within the filter’s methods.
  • Testing: Write unit tests to cover the different branches of your filter logic.
  • Debugging: Make use of logging to help with debugging and troubleshooting issues with the filters.

You May Like This Related .NET Topic

Login to post a comment.