I’m converting a legacy webforms app to MVC, working through it a page at a time. To make the project easier to work with I’ve moved all the webforms pages, which were previously in the route of the project into a /webforms subdirectory. So I need to capture any incoming requests for /page.aspx?param=123 and redirect them to /webforms/page.aspx?param=123. I thought an easy way to do this would be to setup a route handler that passed any such requests to a controller that does that job. I set up a route like so:
routes.MapRoute("WebformsRedirect", "{*page}",
new { controller = "Webforms", action = "ForwardToPage" },
new { page = @"\S+.aspx\S*" }
);
This kind of works but it doesn’t capture the query string, only the page part. I can get the query string for the Request object in the controller so it’s not a huge deal but it would be nice to be able to do it through the route only. My routing unit tests (which I copied from Steve Sanderson’s MVC book) actually pass correctly when I test them with querystrings so I’m confused why it isn’t working. Is my regular expression wrong? They aren’t my strong point.
QueryStrings are not part of the routing
if you requested for example
"Home/Index?foo=bar"and you have a route that match"Foo/Bar"to ControllerFoo, ActionBarwithout any more routing info (don’t know anything about foo) you still can writenow
foovariable will equalbar, why ?because its the model binder that gets the value of the parameters passed.
the model binder check 4 repositories by default QueryString , Routing Place Holders ,FormsCollections and Files
so what i am trying to say , the route and QueryStrings are two different things , it doesn’t need to capture it