我正在将旧版webforms应用程序转换为MVC,一次只能处理一个页面。为了使项目更容易使用,我已将之前在项目路径中的所有webforms页面移动到/ webforms子目录中。因此,我需要捕获/page.aspx?param=123的任何传入请求,并将它们重定向到/webforms/page.aspx?param=123。我认为一种简单的方法是设置一个路由处理程序,将任何此类请求传递给执行该作业的控制器。我设置了这样的路线:
routes.MapRoute("WebformsRedirect", "{*page}",
new { controller = "Webforms", action = "ForwardToPage" },
new { page = @"\S+.aspx\S*" }
);
这种工作但它不捕获查询字符串,只捕获页面部分。我可以在控制器中获取Request对象的查询字符串,所以这不是一个大问题,但能够通过路由只做它会很好。当我使用查询字符串测试时,我的路由单元测试(我从史蒂夫桑德森的MVC书中复制)实际上正确传递,所以我很困惑为什么它不起作用。我的正则表达式错了吗?他们不是我的强项。
答案 0 :(得分:0)
QueryStrings不是路由的一部分
如果您请求示例"Home/Index?foo=bar"
并且您的路由与"Foo/Bar"
匹配到控制器Foo
,则行动Bar
不再有路由信息(不知道任何内容)关于foo)你还可以写
class HomeController: Controller {
ActionResult Index(string foo) {
}
}
现在foo
变量将等于bar
,为什么?
因为它的模型绑定器获取传递的参数的值。
模型绑定器检查默认情况下的4个存储库QueryString,Routing Place Holders,FormsCollections和Files
所以我想说的是,路由和QueryStrings是两个不同的东西,它不需要捕获它