views:

348

answers:

1

How do I create a custom route handler in ASP.NET MVC?

+5  A: 

ASP.NET MVC makes it easy to create a custom route handler in the Global.asax.cs:

    routes.MapRoute(
        "Default",
        "{controller}.aspx/{action}/{id}",
        new { action = "Index", id = "" }
      ).RouteHandler = new SubDomainMvcRouteHandler();

This will result in all requests being handled by the custom RouteHandler specified. For this particular handler:

    public class SubDomainMvcRouteHandler : MvcRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
        {
            return new SubDomainMvcHandler(requestContext);
        }
    }

You can then do whatever you want, in this case the SubDomainMvcHandler grabs the subdomain from the URL and passes it through to the controller as a property:

    public class SubDomainMvcHandler : MvcHandler
    {
        public SubDomainMvcHandler(RequestContext requestContext) : base(requestContext)
        {
        }

        protected override void ProcessRequest(HttpContextBase httpContext)
        {
            // Identify the subdomain and add it to the route data as the account name
            string[] hostNameParts = httpContext.Request.Url.Host.Split('.');

            if (hostNameParts.Length == 3 && hostNameParts[0] != "www")
            {
                RequestContext.RouteData.Values.Add("accountName", hostNameParts[0]);
            }

            base.ProcessRequest(httpContext);
        }
    }
Jason
Perfect. Thanks Jason! Out of interest, what is the general way to go about thanking for a solution on SO? Comment or some other way?
Jamie Dixon
I think the 'thanks' is enough in a peer-reviewed community like this ;-)
Jason