0

我正在将一个旧的 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 书中复制的)在我使用查询字符串测试它们时实际上正确通过了,所以我很困惑为什么它不起作用。我的正则表达式错了吗?他们不是我的强项。

4

1 回答 1

0

QueryStrings 不是路由的一部分

例如,如果您请求"Home/Index?foo=bar"并且您有一个与"Foo/Bar"Controller匹配的路由Foo,则 ActionBar没有更多路由信息(对 foo 一无所知)您仍然可以编写

class HomeController: Controller {
  ActionResult Index(string foo) {

  }
}

现在foo变量将相等bar,为什么?因为它是模型绑定器,它获取传递的参数值。

模型绑定器默认检查 4 个存储库 QueryString 、 Routing Place Holders 、FormsCollections 和 Files

所以我想说的是,路由和查询字符串是两个不同的东西,它不需要捕获它

于 2012-06-21T10:31:29.643 回答