3 votes

Routage des questions de Stack Overflow

Si vous examinez l'URL d'une question SO, vous verrez qu'un ID et un "SLUG" sont transmis au contrôleur Questions : https://stackoverflow.com/questions/676934/what-do-you-need-to-write-your-own-blog-engine . Ce que je trouve intéressant, c'est qu'il est possible de modifier la partie "SLUG" de l'URL sans affecter la capacité de l'application à acheminer la demande. exemple . Le seul moyen que j'ai trouvé pour y parvenir est d'avoir un itinéraire qui accepte un identifiant et un "SLUG" et d'utiliser une contrainte d'itinéraire sur le "slug" pour s'assurer qu'il suit un modèle. J'ai dû utiliser une contrainte pour m'assurer que le fait d'avoir les deux variables n'avait pas pour effet de faire correspondre cette route à toutes les demandes. Est-ce que quelqu'un a une meilleure façon d'accomplir cela, ou des exemples de scénarios de routage plus avancés ?

ADDITION :

Je sais que le SLUG est destiné à la lisibilité humaine et j'aimerais reproduire cette fonction dans une autre application. Quelle est la meilleure façon d'y parvenir ?

Itinéraire :

routes.MapRoute(
    "Id + Slug",          // Route name
    "Test/{id}/{slug}",   // URL with parameters
    new                   // Parameter defaults
    {
        controller = "Test", 
        action = "Details", 
        id = "", 
        slug = "" 
    },  
    new { slug = new SlugConstraint() }
);

Contrainte simple :

public class SlugConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext,
        Route route,
        string parameterName,
        RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        string value = values[parameterName].ToString();

        return value.Contains("-");
    }
}

8voto

JoshJordan Points 8869

Il n'est pas du tout nécessaire d'utiliser la balle. Elle n'est probablement là que pour faciliter la lecture et l'optimisation pour les moteurs de recherche. Vous pouvez l'ignorer lors du routage et vous contenter de travailler jusqu'à l'identifiant.

Par exemple, cliquez ici :

Stack Overflow Question Routing

3voto

Kieron Points 10261

Est cette ce que vous recherchez... il ne définit pas le slug à la fin.

1voto

Pure.Krome Points 28473

Le slug est là pour permettre aux moteurs de recherche de cataloguer la ressource/page. Il n'est pas du tout utilisé dans la route en tant que partie des arguments transmis à la base de données pour récupérer l'article demandé.

L'identification est la partie importante.

Ainsi, dans votre code, la contrainte SlugConstraint n'est pas nécessaire et la valeur de l'argument slug est ignorée dans l'action Details.

Ce comportement est celui de SO et ce que vous pouvez faire, si vous souhaitez copier SO.

0voto

Jen Points 21

La "route" peut être tout ce que le routeur peut être configuré pour gérer. Les parties dynamiques de la "route" sont ensuite transmises à la page d'atterrissage/cible et récupérées via la méthode RouteValue() (dans ASP.NET Routing). Ce que vous faites de ces valeurs sur la page cible dépend entièrement de vous. Utilisez-les ou ignorez-les.

L'ID (dans votre exemple) est donc la clé et le reste (le slug) n'est là que pour la lisibilité humaine et le référencement.

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