【问题标题】:How to route legacy type urls in ASP.NET MVC如何在 ASP.NET MVC 中路由传统类型的 url
【发布时间】:2009-10-13 17:35:15
【问题描述】:

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

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

我觉得我可以对路由做一些事情,但我不知道它是什么。任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net-mvc url-routing


    【解决方案1】:

    BackwardCompatibleAction 方法中的参数val 应自动填充查询字符串值。路由并不意味着处理查询字符串。您在问题中列出的解决方案对我来说很合适。你试过看看会发生什么吗?

    这也适用于您的路线。由于您同时指定了控制器和操作,因此不需要花括号参数。

    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)

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 2010-11-22
      • 2010-11-13
      • 2013-11-29
      • 2011-07-02
      • 1970-01-01
      相关资源
      最近更新 更多