2017-12-20 2 views
2

In einem MVC-basierten Content-Management-System können die Benutzer zur Laufzeit neue Seiten erstellen und einen Slug für die Seite angeben.ASP.Net MVC 4/5 - Routing zur Laufzeit aktualisieren

Ich registrieren diese Schnecken/Routen bei Application_Startup, und es funktioniert super:

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

Wie kann ich wieder laufen RegisterRoutes zur Laufzeit, wenn ein Benutzer eine neue Seite erstellt hat?

Hinweis:

Da der Benutzer eine Schnecke schaffen, habe ich eine dynamische Route mit einem Muster nicht erstellen kann, wie/pages/{} Slug.

Antwort

1

Sie müssen zur Laufzeit keine neuen Routen hinzufügen, und eigentlich sollten Sie nur eine Route für Ihren 'Slug' haben, aber eine Routenbeschränkung hinzufügen, die eine Tabelle der Slugs Ihres Benutzers anzeigt. Wenn es mit einem Wert in der Datenbank übereinstimmt, führt es diese Route aus, andernfalls wird es auf die nächste passende Route fallen.

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

Da dies in jeder Anforderung aufgerufen werden, sollten Sie eine neue Seite von einem Benutzer erstellt wird, das Zwischenspeichern die Butzen (sagt in MemoryCache) und jedes Mal prüfen, um den Cache ungültig machen und sie aktualisieren wieder aus der Datenbank.

+0

Ausgezeichnet, das macht es viel einfacher zu verwalten als die Routen beim Start zu generieren. :) – Kjensen