ASP.NET MVC: Enforce AJAX request on an action
Asked Answered
M

2

11

I'm looking for a way to enforce a controller's action to be accessed only via an AJAX request.

What is the best way to do this before the action method is called? I want to refactor the following from my action methods:

if(Request.IsAjaxRequest())
    // Do something
else
    // return an error of some sort

What I'm envisioning is an ActionMethodSelectorAttribute that can be used like the [AcceptVerbs] attribute. I have no experience crating such a custom attribute though.

Massotherapy answered 12/11, 2010 at 19:31 Comment(0)
H
17

Create an ActionFilter that fires OnActionExecuting

public class AjaxActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
            filterContext.Result = new RedirectResult(//path to error message);           
    }
}

Setting the filter's Result property will prevent execution of the ActionMethod.

You can then apply it as an attribute to your ActionMethods.

Honkytonk answered 12/11, 2010 at 20:31 Comment(1)
+1, of the ways presented, this is by and far the one closest to my preferred approach and is extensible, especially if sited in a basecontroller that all others inherit fromMenadione
G
2

Its as simple as this:

public class AjaxOnly : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.IsAjaxRequest();
    }
}

I just forget where IsAjaxRequest() comes from, I'm pasting from code I have but "lost" that method. ;)

Gamma answered 12/11, 2010 at 20:41 Comment(2)
Ooops, didn't get the part about returning an error. This makes it so the method will never get his unless the request is Ajax. Just another way to do it.Gamma
I know this answer was posted aaaaaages ago but the IsAjaxRequest hangs off the request object not the Httpcontext.Billups

© 2022 - 2024 — McMap. All rights reserved.