如何实现类似于SO的url重写

我需要在我的asp.net MVC网站上实现类似function。

例如,当用户转到https://stackoverflow.com/questions/xxxxxxxx

加载后主题行与url和url连接成这样https://stackoverflow.com/questions/xxxxxxxx/rails-sql-search-through-has-one-relationship

上面的“/ rails-sql-search-through-has-one-relationship”部分被添加到了url中。

在webforms中很简单,我可以使用url重写。 但不知道如何在MVC中做到这一点

以下行来自Global.asax文件

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

我需要连接的string是在我的数据库,所以它从那里提取。 我怎样才能做到这一点?

这被称为slu route的路线。 实现这一点的一个方法是用一个可选的slug参数定义一个path,并在控制器方法中检查是否提供了参数

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

然后在QuestionController (假设一个id将始终提供)

 public ActionResult Details (int id, string slug) { if (string.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); } 

您正在寻找一个自定义的路线。 如果仔细观察,SO不关心URL的文本部分。 所以:

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

两者都可以工作。 你可以很容易地做到这一点,如:

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

诀窍是在创build链接时在最后添加“slug”:

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