I found out this was possible using the constraints attribute when you setup your route. I created a new constraint by extending IRouteConstraint and forwarded the look up on to a model where I did the database look up.
App_Start >> RouteConfig
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using myApp.App_Start;
namespace myApp
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "LocationSite",
url: "{id}/{action}",
defaults: new { controller = "Snowboard", action = "Index", id = UrlParameter.Optional },
constraints: new { id = new SnowboardSiteRouteConstraint() }/*---database lookup for snowboards---*/
);
}
}
}
App_Start >> SnowboardSiteRouteConstraint
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using myApp.Models;
namespace myApp.App_Start
{
public class SnowboardSiteRouteConstraint: IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName,RouteValueDictionary values, RouteDirection routeDirection)
{
/*---database lookup for snowboards---*/
return SnowboardSite.IsSnowboardSiteName((string)values["id"]);
}
}
}
Model >> SnowboardSite
using System;
using System.Collections.Generic;
using System.Web;
using myApp.Persistence;
using myApp.Entities;
using NHibernate;
using NHibernate.Linq;
namespace myApp.Models{
public class SnowboardSite{
public static bool IsSnowboardSiteName(string boardName){
/*---database lookup for snowboards, return the result as boolean---*/
return [[result of database lookup goes here as a boolean]];
}
}
}