【发布时间】:2014-09-19 14:11:29
【问题描述】:
我们正在将旧应用迁移到 .NET MVC,并且必须保持旧 URL 的向后兼容性。考虑一个 URL 如下所示的论坛应用程序
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 的路径部分,而不是参数。我尝试了以下方法,但无济于事:
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 -
你的示例路由是这样 routes.MapRoute( name: "TestRoutes", url: "{controller}/?page={action}", defaults: new {controller = " Forums", action = "ForumsList"}); 你试过了吗:routes.MapRoute( name: "TestRoutes", url: "{controller}/?page={action}", defaults: new {controller = "论坛", action = "{action}");
标签: c# asp.net .net asp.net-mvc asp.net-mvc-4