70 votes

La dynamique des Itinéraires à partir de la base de données pour ASP.NET MVC CMS

Fondamentalement, j'ai un CMS backend j'ai construit à l'aide de ASP.NET MVC et maintenant, je me déplace sur le frontend du site et doivent être en mesure de charger les pages de mon cms, base de données, basée sur l'itinéraire entré.

Donc, si l'utilisateur entre domain.com/students/information, MVC, regarde dans les pages de la table pour voir si une page existe un lien permanent qui correspond étudiants/de l'information, dans l'affirmative, il serait de rediriger vers le contrôleur de la page et ensuite de charger les données de la page à partir de la base de données et de le retourner à l'affichage pour l'affichage.

Jusqu'à présent j'ai essayé d'avoir un fourre-tout de l'itinéraire, mais il ne fonctionne que pour les deux URL segments, de sorte que /étudiants/de l'information, mais ce n'est pas /étudiants/information/de l'automne. Je ne peux pas trouver quelque chose en ligne sur la façon de le faire, donc j'ai pensé que je voudrais poser ici, avant que je trouve et open source ASP.NET MVC de la cms et de disséquer le code.

Voici le parcours de configuration j'ai jusqu'à présent, mais je sens qu'il y a 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 me pointer dans la bonne direction sur la façon dont j'allais sur le chargement de pages CMS à partir de la base de données, avec un maximum de trois URL segments, et encore être en mesure de la charge de base des pages, qui ont un contrôleur et l'action prédéfinie.

131voto

shakib Points 2458

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

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

l'utiliser dans la définition de la route 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 un 'Indice' action 'Page' Contrôleur comme,

public ActionResult Index(string permalink)
{
    //load the content from db with permalink
    //show the content with view
}
  1. toutes les url seront pris par le premier parcours, être vérifiée par la contrainte.
  2. si le permalien existe en db, l'url sera traitée par l'Indice de l'action dans le contrôleur de la Page.
  3. si ce n'est la contrainte de l'échec et de l'url de secours de 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 404 logique).

espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X