如果我們只輸入問題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