0

像stackoverflow一样,你有domain/questions/{id}/{title}

您实际发送的标题无关紧要,如果它不是问题的实际标题,它会自动redirect 302对规范网址执行我认为的永久操作。

这一切都很好。

我想知道的是他们如何在问题列表中创建链接。由于拥有问题 ID 不足以创建 url。

可以通过路由自动完成吗?

必须实现某种大字典吗?

您将标题传递给列出问题的所有视图?所以你最终会得到类似的东西:@Url.Action("Question", new {id = item.QuestionId, title = item.QuestionTitle.ToPrettyUrl()});在你的链接中。

我必须创建一个与此类似的场景,我有点想知道幕后是否有任何魔法或我现在无法想到的解决方案。

4

2 回答 2

0

是的,每当您呈现链接时,您都需要指定标题,就像您拥有它一样。

当然,您总是可以创建一个帮助方法来创建这些链接,并只需传入参数以确保您始终包含友好的标题。

至于重定向,StackOverflow 执行 301 永久重定向,而不是 302 临时重定向。

我对此的一般方法如下:

public ActionResult QuestionDetail(int id, string title)
{
   var question = service.GetQuestion(id);

   if(title != question.Title.ToPrettyUrl())
   {
     var redirUrl = string.Format("/question/{0}/{1}", id, question.Title.ToPrettyUrl());
     return RedirectPermanent(redirectUrl);
   }

  return View(question)
}
于 2013-08-09T00:28:00.643 回答
0

Stackoverflow 使用内部属性路由代码。

类似于http://attributerouting.net/属性路由所做的事情。

这也将在 MVC 5 中提供。

于 2013-08-09T02:18:49.513 回答