我們正在將遺留應用遷移到.NET MVC,並且必須保持舊URL的向後兼容性。考慮一個論壇應用程序中的URL看起來像這樣基於查詢參數的ASP.NET MVC自定義路由
http://example.com/forums?page=ForumsList - shows a list of all forums
http://example.com/forums?page=Threads&forumId=1 - shows list of threads in forum 1
http://example.com/forums?page=Posts&forumId=1&threadId=1 - shows posts in forum 1, thread 1.
我想在我的控制器來操作這些相同的URL映射,即
public ActionResult ForumsList(){}
public ActionResult Threads(string forumId){}
public ActionResult Posts(string forumId, string threadId){}
沒有複製該維護的噩夢,我們在我們的傳統了系統
public ActionResult Index(string page){
if (page == "Forums"){
return Forums();
}
else if (page == "Threads){
return Threads(Request.Params["forumId"]);
}
else if (page == "Posts"){
return Posts(Request.Params["forumId"], Request.Params["threadId"]);
}
// oh, there's more. a lot more.
}
所有我能找到自定義路由的文件似乎表明,它只能解析URL,而不是則params的路徑部分。我嘗試了以下,無濟於事:
routes.MapRoute(
name: "TestRoutes",
url: "{controller}/?page={action}",
defaults: new {controller = "Forums", action = "ForumsList"});
我還能做什麼?
你看過IIS重寫模塊,它會攔截請求並將它們重新引導或將它們重定向到新路由,然後它們碰到asp.net處理程序並被路由到適當的控制器。它支持相當不錯的正則表達式模式匹配。你可以很容易地將'forums?page = Threads&forumId = 1'改寫成類似於'/ forums/threads/1'的文件。 – 2014-09-19 14:19:25
你是這樣的路由示例: ** routes.MapRoute( name:「TestRoutes」, url: {}控制器/頁= {}行動」, 默認:新{控制器= 「?論壇」,行動= 「ForumsList」}); ** 你試過: ** routes.MapRoute( 名稱: 「TestRoutes」, url:「{controller} /?page = {action}」, 默認值:new {controller =「Forums」,action =「{action}」); ** – Pheonyx 2014-09-19 14:34:53