如何在ASP.NET MVC中路由遗留类型URL

时间:2009-10-13 17:35:16

标签: asp.net-mvc url-routing

由于我无法控制的因素,我需要处理这样的网址:

我想将它们路由到一个特定的控制器/动作,其中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。虽然我可以解析控制器内部的查询字符串,但它会使测试操作更加困难,我宁愿不依赖它。

我觉得我可以对路由做些什么,但我不知道它是什么。任何帮助都将非常感激。

1 个答案:

答案 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)