Как SO выполняет перезапись URL, если мы добавляем только идентификатор вопроса?
questions/{id}/{whatever}
до
questions/{id}/{question-slug}
Я работаю некоторое время с MVC и япусть он работает (маршруты, действия, все), чтобы он подбирал правильное содержимое на основе предоставленного идентификатора.
Однако часть после {id}
(часть слага) остается такой же, как и введенная вПоэтому, если кто-то наберет content/5/foobar
, он отобразит правильный контент, но оставит там foobar
.
В контроллере (или где-то еще, пожалуйста, предложите, где), мне нужно будет перейти вБД и вытащите правильный слаг, поместите его в данные маршрута и затем выполните перенаправление к тому же действию с этими правильными данными, я думаю?
Это попытка с переопределением результата выполнения.Он работает, но не перенаправляет и не заменяет / не отображает правильный URL в браузере:
protected override void Execute(System.Web.Routing.RequestContext requestContext) {
if (requestContext.RouteData.Values["id"] != null) {
string currentSlug = _repository.Find(int.Parse(requestContext.RouteData.Values["id"].ToString())).Slug;
if (requestContext.RouteData.Values["slug"] != null) {
requestContext.RouteData.Values.Remove("slug");
}
requestContext.RouteData.Values.Add("slug", currentSlug);
}
base.Execute(requestContext);
}
Это еще одна, хорошо работающая версия действия Display
, так что вы можете увидеть, что он делает, и получитьИдея, что я хочу:
//
// GET: {culture}/directory/5/{slug}
public virtual ActionResult Display(int id, string slug)
{
var model = _repository.Find(id);
if (model != null) {
if (!model.Slug.Equals(slug, System.StringComparison.OrdinalIgnoreCase)) {
return RedirectToActionPermanent(pndng.DirectoryEntry.ActionNames.Display, pndng.DirectoryEntry.Name, new { id = model.Id, slug = model.Slug });
}
return View(model);
}
// no model found
return InvokeHttp404(HttpContext);
}
Этот выполняет постоянное перенаправление (он делает то, что я хочу), но верно ли это?Наверное, мне нужен редирект для обновления URL браузера, не так ли?