2017-12-20 10 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

実行時に新しいルートを追加する必要はなく、実際には 'slug'のルートは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