Может быть, в самом начале добавить пользовательский маршрут, который будет наследоваться от System.Web.Routing.Route, и переопределить метод
protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint,
string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
, где вы будете проверять в БД, используя индексированный столбец.
Просто добавьте некоторый необнуляемый объект ограничения, такой как
Constraints = new { username = "*" }
, чтобы объект маршрута обрабатывал ограничения.
Перед попаданием в базу данных, возможно, сделайте некоторую эвристику, может ли это быть имя пользователя.Помните, что у вас не может быть такого же пользователя, как у контроллера (при наличии действия по умолчанию), поэтому вы хотите как-то ограничить его.Обратите внимание, если это не повредит годовой производительности, но у вас, вероятно, не много маршрутов с одним значением после косой черты.
Вот как вы можете это сделать.
public class UserRoute : Route
{
public UserRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler)
{
}
protected override bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.UrlGeneration)
return true;
object value;
values.TryGetValue(parameterName, out value);
string input = Convert.ToString(value, CultureInfo.InvariantCulture);
// check db
if (!CheckHeuristicIfCanBeUserName(input))
{
return false;
}
// check in db if exists,
// if yes then return true
// if not return false - so that processing of routing goes further
return new[] {"Javad_Amiry", "llapinski"}.Contains(input);
}
private bool CheckHeuristicIfCanBeUserName(string input)
{
return !string.IsNullOrEmpty(input);
}
}
Это добавление в начале.
routes.Add(new UserRoute("{username}",
new RouteValueDictionary(){ {"controller", "Home"}, {"action", "About"}},
new RouteValueDictionary(){ { "username", "*" }}, new MvcRouteHandler()));
Работает для меня обоими способами, генерируя и поступая.