如何实现类似于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) })