由于我无法控制的因素,我需要处理这样的网址:
我想将它们路由到一个特定的控制器/动作,其中val已经被解析和绑定(即动作的参数)。
理想情况下,我的行动会是这样的:
ActionResult BackwardCompatibleAction(int val)
我发现了这个问题:ASP.Net MVC routing legacy URLs passing querystring Ids to controller actions但重定向是不可接受的。
我尝试过解析查询字符串部分的路由,但任何带问号的路由都是无效的。
我已经能够用这个来路由请求:
routes.MapRoute(
"dosomething.asp Backward compatibility",
"{dosomething}.asp",
new { controller = "MyController", action = "BackwardCompatibleAction"}
);
然而,从那里唯一的方法来获得val =的值?是通过Request.QueryString。虽然我可以解析控制器内部的查询字符串,但它会使测试操作更加困难,我宁愿不依赖它。
我觉得我可以对路由做些什么,但我不知道它是什么。任何帮助都将非常感激。
答案 0 :(得分:3)
val
方法中的参数BackwardCompatibleAction
应自动填充查询字符串值。路由不是要处理查询字符串。您在问题中列出的解决方案对我来说是正确的。你试过看看会发生什么吗?
这也适用于您的路线。由于您同时指定了控制器和操作,因此不需要花括号参数。
routes.MapRoute(
"dosomething.asp Backward compatibility",
"dosomething.asp",
new { controller = "MyController", action = "BackwardCompatibleAction"}
);
如果你需要参数化动作名称,那么这样的事情应该有效:
routes.MapRoute(
"dosomething.asp Backward compatibility",
"{action}.asp",
new { controller = "MyController" }
);
这将为您提供一个更通用的路由,可以将多个不同的.asp页面URL匹配到Action方法中。
http://www.bob.com/dosomething.asp?val=42
将路由到MyController.dosomething(int val)
和http://www.bob.com/dosomethingelse.asp?val=42
将路由到MyController.dosomethingelse(int val)