如果我们只输入问题ID,SO如何执行URL重写?stackoverflow URL重写
questions/{id}/{whatever}
到
questions/{id}/{question-slug}
我已经工作了一段时间,MVC和我有工作(路线,动作,一切),因此它拿起根据提供的ID正确的内容。
但是{id}
(slug部分)后面的部分保持不变,所以如果有人输入content/5/foobar
,它会显示正确的内容,但会将foobar
留在那里。我需要进入数据库,然后把右边的弹塞拉出来,放到路径数据中,然后用这个正确的数据执行重定向到同一个动作。 , 我猜?
这是一个使用Execute Result重写的尝试。它的工作原理,但不重定向或更换/在浏览器中显示正确的网址:
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,不是吗?
您需要使用['RedirectResult'](http://msdn.microsoft.com/zh-cn/library/system.web.mvc.redirectresult.aspx)。 – Oded 2012-03-21 14:07:59