捕获MVC路由中的传入webforms请求

时间:2012-06-21 09:49:52

标签: asp.net asp.net-mvc asp.net-mvc-routing

我正在将旧版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书中复制)实际上正确传递,所以我很困惑为什么它不起作用。我的正则表达式错了吗?他们不是我的强项。

1 个答案:

答案 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是两个不同的东西,它不需要捕获它