ASP.Net MVC 4/5 - 在运行时刷新路由
ASP.Net MVC 4/5 - Refresh routing at runtime
在基于 MVC 的内容管理系统中,用户可以在 运行 时创建新页面并为页面指定 slug。
我在 application_startup 注册了这些 slugs/routes,效果很好:
foreach (var slug in pagesSlugs)
{
routes.MapRoute(
name: $"Page-{slug}",
url: $"{slug}",
defaults: new { controller = "Page", action = "Details", slug = slug }
);
}
当用户创建新页面时,如何在 运行 时重新 运行 RegisterRoutes?
注:
由于用户可以创建任何 slug,我无法创建带有模式的动态路由,例如 /pages/{slug}。
您不需要在 运行 时添加新路由,事实上您的 'slug' 应该只有一条路由,但添加一个路由约束来查找 table 你的用户的鼻涕虫。如果它匹配到数据库中的某个值,那么它将执行该路由,否则它将落到下一个匹配的路由。
routes.MapRoute(
name: "Page",
url: "{slug}",
defaults: new { controller = "Page", action = "Details" }
constraints: new { slug = new SlugConstraint() }
)
public class SlugConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
IEnumerable<string> slugs = ... // your code to get the slugs
// Get the slug from the url
var slug = values["slug"].ToString().ToLower();
// Check for a match (assumes case insensitive)
return slugs.Any(x => x.ToLower() == slug);
}
}
因为这将在每个请求中调用,你应该考虑缓存 slugs(比如在 MemoryCache
中)并且每次用户创建新页面时,使缓存无效并从数据库。
在基于 MVC 的内容管理系统中,用户可以在 运行 时创建新页面并为页面指定 slug。
我在 application_startup 注册了这些 slugs/routes,效果很好:
foreach (var slug in pagesSlugs)
{
routes.MapRoute(
name: $"Page-{slug}",
url: $"{slug}",
defaults: new { controller = "Page", action = "Details", slug = slug }
);
}
当用户创建新页面时,如何在 运行 时重新 运行 RegisterRoutes?
注:
由于用户可以创建任何 slug,我无法创建带有模式的动态路由,例如 /pages/{slug}。
您不需要在 运行 时添加新路由,事实上您的 'slug' 应该只有一条路由,但添加一个路由约束来查找 table 你的用户的鼻涕虫。如果它匹配到数据库中的某个值,那么它将执行该路由,否则它将落到下一个匹配的路由。
routes.MapRoute(
name: "Page",
url: "{slug}",
defaults: new { controller = "Page", action = "Details" }
constraints: new { slug = new SlugConstraint() }
)
public class SlugConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
IEnumerable<string> slugs = ... // your code to get the slugs
// Get the slug from the url
var slug = values["slug"].ToString().ToLower();
// Check for a match (assumes case insensitive)
return slugs.Any(x => x.ToLower() == slug);
}
}
因为这将在每个请求中调用,你应该考虑缓存 slugs(比如在 MemoryCache
中)并且每次用户创建新页面时,使缓存无效并从数据库。