comment implémenter la réécriture d’URL similaire à SO

Je dois mettre en œuvre une fonctionnalité semblable à celle de SO sur mon site asp.net MVC.

Par exemple, lorsque l’utilisateur accède à https://stackoverflow.com/questions/xxxxxxxx

après le chargement, la ligne d’object est concaténée avec l’URL et devient l’URL https://stackoverflow.com/questions/xxxxxxxx/rails-sql-search-through-has-one-relationship

Au-dessus, la partie “/ rails-sql-search-through-has-one-one-relationship” est ajoutée à l’URL.

Dans les formulaires Web, c’est simple, je pourrais simplement utiliser la réécriture d’URL. Mais pas sûr de savoir comment accomplir cela dans MVC

La ligne suivante provient du fichier Global.asax

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Account", action = "LogOn", id = UrlParameter.Optional } // Parameter defaults ); 

la chaîne que je dois concaténer se trouve dans ma firebase database, donc elle va chercher à partir de là. Comment puis-je accomplir cela?

Ceci s’appelle une route de limace. Un moyen d’y parvenir est de définir une route avec un paramètre optionnel slug et de vérifier dans la méthode du contrôleur si le paramètre a été fourni.

 routes.MapRoute( name: "Question", url: "Question/{id}/{slug}", defaults: new { controller = "Question", action = "Details", slug = UrlParameter.Optional } ); 

Puis dans QuestionController (en supposant qu’un identifiant sera toujours fourni)

 public ActionResult Details (int id, ssortingng slug) { if (ssortingng.IsNullOrEmpty(slug)) { // Look up the slug in the database based on the id, but for testing slug = "this-is-a-slug"; return RedirectToAction("Details", new { id = id, slug = slug }); } var model = db.Questions.Find(id); return View(model); } 

Vous recherchez un itinéraire personnalisé. Si vous regardez de près, SO ne s’intéresse pas à la partie texte de l’URL. Alors:

  http://stackoverflow.com/questions/xxxxxxxx/rails-sql-search-through-has-one-relationship AND http://stackoverflow.com/questions/xxxxxxxx/ 

Est-ce que les deux fonctionnent. Vous pouvez facilement le faire avec quelque chose comme:

 routes.MapRoute( "Question", "questions/{id}/{title}", new { controller = "Question", action = "Details" }); 

L’astuce consiste à append le “slug” à la fin lorsque vous créez des liens:

 @Html.RouteLink( "Read more.", "Question", new { id = question.Id, title = Slugger.ToUrl(question.Title) })