Routes dynamics à partir de la firebase database pour ASP.NET MVC CMS

Fondamentalement, j’ai un backend CMS que j’ai construit en utilisant ASP.NET MVC et maintenant je passe au site frontend et je dois pouvoir charger des pages de ma firebase database cms, en fonction de la route entrée.

Donc, si l’utilisateur entre domain.com/students/information, MVC recherche dans la table des pages s’il existe une page avec un lien permanent correspondant aux étudiants / informations, si c’est le cas, il redirectait vers le contrôleur de page, puis chargerait la page les données de la firebase database et les renvoyer à la vue pour les afficher.

Jusqu’à présent, j’ai essayé d’avoir un itinéraire complet, mais cela ne fonctionne que pour deux segments d’URL, donc / étudiants / information, mais pas / étudiants / information / automne. Je ne trouve rien en ligne sur la façon d’accomplir cela, alors je me suis posé la question ici, avant de trouver et d’ouvrir le logiciel ASP.NET MVC cms et de disséquer le code.

Voici la configuration de l’itinéraire que j’ai à ce jour, mais je pense qu’il existe une meilleure façon de le faire.

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // Default route to handle core pages routes.MapRoute(null,"{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new { controller = "Index" } ); // CMS route to handle routing to the PageController to check the database for the route. var db = new MvcCMS.Models.MvcCMSContext(); //var page = db.CMSPages.Where(p => p.Permalink == ) routes.MapRoute( null, "{*.}", new { controller = "Page", action = "Index" } ); } 

Si quelqu’un peut m’orienter dans la bonne direction concernant le chargement des pages du CMS à partir de la firebase database, avec jusqu’à trois segments d’URL, tout en étant capable de charger les pages principales, un contrôleur et une action sont prédéfinis.

Vous pouvez utiliser une contrainte pour décider de remplacer ou non la logique de routage par défaut.

 public class CmsUrlConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, ssortingng parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var db = new MvcCMS.Models.MvcCMSContext(); if (values[parameterName] != null) { var permalink = values[parameterName].ToSsortingng(); return db.CMSPages.Any(p => p.Permalink == permalink); } return false; } } 

l’utiliser dans la définition d’itinéraire comme,

 routes.MapRoute( name: "CmsRoute", url: "{*permalink}", defaults: new {controller = "Page", action = "Index"}, constraints: new { permalink = new CmsUrlConstraint() } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

Maintenant, si vous avez une action ‘Index’ dans ‘Page’ Controller comme,

 public ActionResult Index(ssortingng permalink) { //load the content from db with permalink //show the content with view } 
  1. toutes les URL seront capturées par le premier itinéraire et vérifiées par la contrainte.
  2. Si le lien permanent existe dans la firebase database, l’URL sera gérée par l’action Index dans le contrôleur de page.
  3. sinon la contrainte échouera et l’url retournera à la route par défaut (je ne sais pas si vous avez d’autres contrôleurs dans le projet et comment vous allez décider de votre logique 404).

MODIFIER

Pour éviter d’interroger la page cms dans l’action Index dans le contrôleur de Page , on peut utiliser le dictionnaire HttpContext.Items , comme

dans la contrainte

 var db = new MvcCMS.Models.MvcCMSContext(); if (values[parameterName] != null) { var permalink = values[parameterName].ToSsortingng(); var page = db.CMSPages.Where(p => p.Permalink == permalink).FirstOrDefault(); if(page != null) { HttpContext.Items["cmspage"] = page; return true; } return false; } return false; 

alors dans l’action,

 public ActionResult Index(ssortingng permalink) { var page = HttpContext.Items["cmspage"] as CMSPage; //show the content with view } 

J’espère que cela t’aides.