You need to create a custom DynamicRouteValueTransformer
public class AppDynamicRouteValueTransformer : DynamicRouteValueTransformer
{
private readonly IList<AliasRouteMap> _aliasMaps;
public AppDynamicRouteValueTransformer()
{
//--you can retrieve it from database table, from config....
//--for demo I will do it manually
_aliasMaps = new List<AliasRouteMap>(
new[]
{
new AliasRouteMap("aaaaaa", "Cats", "product", 1),
new AliasRouteMap("bbbbbb", "Cats", "product", 1)
}
);
}
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
await Task.CompletedTask;
if (!values.ContainsKey("alias"))
return values;
var alias = (string)values["alias"];
var aliasMap = _aliasMaps.FirstOrDefault(x => x.Alias.ToLower() == alias.ToLower());
if (aliasMap is null)
return values;
values["controller"] = aliasMap.Controller;
values["action"] = aliasMap.Action;
if (aliasMap.Values != null)
{
foreach (var kvp in aliasMap.Values)
values[kvp.Key] = kvp.Value;
}
return values;
}
}
public class AliasRouteMap
{
public AliasRouteMap(string alias, string controller, string action, object id)
: this(alias, controller, action, new Dictionary<string, object> { { "id", id } })
{ }
public AliasRouteMap(string alias, string controller, string action = "Index", IDictionary<string, object> values = null)
{
Alias = alias;
Controller = controller;
Action = action;
Values = values;
}
public string Alias { get; set; }
public string Controller { get; }
public string Action { get; }
public IDictionary<string, object> Values { get; }
}
The register the service and configure the routing in Startup class.
...
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<AppDynamicRouteValueTransformer>();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
endpoints.MapDynamicControllerRoute<AppDynamicRouteValueTransformer>("{alias}");
...
}
...
}
...