如何在ASP.Net MVC 3中路由遗留的QueryString参数?

时间:2011-03-11 22:08:43

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

我正在使用第三方服务,该服务对我提供给他们的网址执行异步回调。 所以我告诉他们使用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参数的内容。

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分: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的方法将是最好的选择。

答案 2 :(得分:0)

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