ASP.NET MVC 4/5-运行时刷新路由



在基于MVC的内容管理系统中,用户可以在运行时创建新页面并为页面指定一个sl。

i在application_startup上注册这些slugs/路线,它的工作原理很棒:

foreach (var slug in pagesSlugs)
        {
            routes.MapRoute(
                name: $"Page-{slug}",
                url: $"{slug}",
                defaults: new { controller = "Page", action = "Details", slug = slug }
            );
        }

当用户创建一个新页面时,如何在运行时重新运行寄存器?

注意:

由于用户可以创建任何slug,所以我无法创建一个具有模式的动态路由,例如/pages/{slug}。

您不需要在运行时添加新路由,实际上,您只需要一个路由来'slug'您用户的sl。如果它与数据库中的值匹配,则将执行该路由,否则将落在下一个匹配路由下。

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);
    }
}

由于每个请求中都会调用这一点,因此您应该考虑缓存SLUG(例如MemoryCache),并且每次用户创建一个新页面时,请无效缓存并从数据库中再次刷新它。

最新更新