Extending ASP.NET MVC’s Action Resolving Logic

As a .NET developer, I really like ASP.NET MVC web framework. It has a lot of extension points. Just now I have a task to integrate mobile website to existing website. So instead of having a single responsive view, we have 2 separate views. Mobile browser will display the jQuery mobile version.

ASP.NET MVC by default doesn’t accept action method overloading unless if the method has [ActionMethodSelectorAttribute] which is useful to determine the action selection.

One of its implementation is AcceptVerbsAttribute class, which is used to determine that a specific action only responds to the specified HTTP verb.

In my case, I have an action which only makes sense for mobile view.

public class AcceptClientAttribute : ActionMethodSelectorAttribute
{
    private readonly ClientType clientType;

    public AcceptClientAttribute(ClientType clientType)
    {
        this.clientType = clientType;
    }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        switch(clientType)
        {
            case ClientType.Mobile:
                return controllerContext.RequestContext.HttpContext.Request.Browser.IsMobileDevice;

            default:
                return !controllerContext.RequestContext.HttpContext.Request.Browser.IsMobileDevice;
        }
         
    }
}

public enum ClientType
{
    Desktop,
    Mobile
}

The usage is just like action filter, so we apply it to action's attribute.

As additional note, I use 51Degrees.mobi for device detection. It automatically overrides Request.Browser property.