ASP.NET MVC Как создавать ссылки действий на основе маршрутизации

Как Stackru, у вас есть domain/questions/{id}/{title}

Не имеет значения, что вы на самом деле отправляете в качестве заголовка, если это не фактический заголовок вопроса, он автоматически делает постоянным redirect 302 Я думаю, чтобы канонический URL.

Это все красиво и здорово.

Что мне интересно, так это то, как они создают ссылки в списке вопросов. Поскольку наличие идентификатора вопроса недостаточно для создания URL.

Может быть сделано автоматически через маршрутизацию?

Нужно реализовать какой-то большой словарь?

Вы передаете заголовок всем представлениям, в которых перечислены вопросы? так что вы получите что-то вроде: @Url.Action("Question", new {id = item.QuestionId, title = item.QuestionTitle.ToPrettyUrl()}); в ваших ссылках.

Я должен создать сценарий, похожий на этот, и мне интересно узнать, есть ли какая-то магия за кулисами или решение, о котором я не могу сейчас думать.

2 ответа

Решение

Stackru использует внутренний код маршрутизации атрибутов.

Что-то похожее на то, что делает http://attributerouting.net/ Attribute Routing.

Который также будет отправлен в MVC 5.

Да, всякий раз, когда вы отображаете ссылку, вам нужно указывать заголовок так же, как он у вас есть.

Конечно, вы всегда можете создать вспомогательный метод для создания этих ссылок и просто передать параметры, чтобы убедиться, что вы всегда включаете дружественный заголовок.

Что касается перенаправления, Stackru выполняет перенаправление 301 Permanent, а не 302 Temporary.

Мой общий подход к этому будет следующим:

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)
}
Другие вопросы по тегам