【问题标题】:How to route legacy QueryString parameters in ASP.Net MVC 3?如何在 ASP.Net MVC 3 中路由旧的 QueryString 参数?
【发布时间】:2011-03-11 22:08:42
【问题描述】:

我正在使用第三方服务对我提供给他们的 URL 进行异步回调。 所以我告诉他们使用http://www.mysite.com/Status/Incoming。 这显然必须映射到我的 StatusController 上的 Incoming() 方法。

但是,我无法控制的是他们用来调用我的 URL 的参数的格式。 例如。他们会做一个回调,例如:http://www.mysite.com/Status/Incoming?param1=val1&param2=val2&param3=val3

我想将此映射到我的操作方法的参数:Incoming(string param1, string param2, int param3)

我该怎么做?

我找到了很多关于自定义路由的资料,但没有找到关于旧版 QueryString 参数的资料。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    没有像遗留查询字符串参数这样的东西。有查询字符串参数,它们是 HTTP 规范的一部分。并且假设调用了http://www.mysite.com/Status/Incoming?param1=val1&param2=val2&param3=val3 url,您不需要任何路由来使其映射到以下操作(默认路由就可以了):

    public ActionResult Incoming(string param1, string param2, string param3)
    {
        ...
    }
    

    默认模型将负责绑定这些值。

    【讨论】:

    • “没有遗留查询字符串参数之类的东西。”好的,好的,但你知道我的意思。 :) Tnx,完美运行!
    【解决方案2】:

    为什么不使用全部捕获?

            routes.MapRoute(
                "Incoming", 
                "Status/Incoming/{*path}", // URL with parameters
                new { controller = "Status", action = "Incoming"} 
            );
    

    然后在你的控制器中,

      public ActionResult Incoming(string path){
            //  the next line would probably be better off in a model binder, but this works:
            var dictionary = path
                .Substring(path.IndexOf("?")+1)
                .Split("&")
                .Select(x =>
                            {
                                var kvArray = x.Split("=");
                                return new KeyValuePair<string, string>(kvArray[0], kvArray[1]);
                            })
                            .ToDictionary(x=>x.Key,x=>x.Value);
               return Incoming(dictionary);
      }
    
      public ActionResult Incoming(Dictionary<string,string> dictionary){
           //do stuff
      }
    

    话虽如此,我认为使用Request.QueryString 可能是一种更好的方法。只要您使用 MVC,就可以从您的控制器访问它。但是,如果您可以保证传递正确的参数,那么 Darin 的方法将是最佳选择。

    【讨论】:

      【解决方案3】:

      当我之前不得不处理这个问题时,我只使用 Request.QueryString 的“遗留”调用。它仍然有效,即使它不是很优雅。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2011-09-25
        • 2012-09-05
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        相关资源
        最近更新 更多