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)
}