2017-12-20 1 views
2

MVC 기반 콘텐트 관리 시스템에서 사용자는 런타임에 새 페이지를 만들고 해당 페이지에 슬러그를 지정할 수 있습니다.ASP.Net MVC 4/5 - 런타임에 라우팅 새로 고침

나는 application_startup에서 이러한 슬러그/경로를 등록하고 그것을 잘 작동합니다 : 런타임에

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

어떻게 다시 실행할 수 RegisterRoutes, 사용자가 새 페이지를 만들 때?

참고 :

유저가 모든 슬러그를 만들 수 있기 때문에, 나는 패턴으로 동적 경로를 만들 수 없습니다/페이지/{슬러그}있다.

답변

1

런타임에 새 경로를 추가 할 필요가 없으며 사실 '슬러그'를위한 경로가 하나만 있어야하지만 사용자의 슬러그 테이블을 찾는 경로 제약 조건을 추가해야합니다. 데이터베이스의 값과 일치하면 해당 경로가 실행되고, 그렇지 않으면 다음 일치하는 경로로 넘어갑니다. 이 이후

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

는 각 요청에 호출됩니다, 당신은 슬러그 ( MemoryCache에서 말하는) 새로운 페이지가 사용자가 생성 될 때마다 캐시 고려 캐시를 무효화하고 데이터베이스에서 다시 새로 고침합니다.

+0

우수한 기능으로 시작시 경로를 생성하는 것보다 관리하기가 훨씬 쉽습니다. :) – Kjensen