2011-03-11 87 views
2

我正在使用第三方服务对我提供给他们的URL执行异步回调。 所以我告诉他们使用http://www.mysite.com/Status/Incoming。 这显然必须映射到我的StatusController上的Incoming()方法。如何在ASP.Net MVC 3中路由遗留的QueryString参数?

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

我想这个映射到我的行动方法的参数:接收(字符串参数1,字符串参数2,INT参数3)

我该怎么办呢?

我发现了很多关于自定义路由的东西,但没有提到遗留的QueryString参数。

回答

8

有没有这样的事情遗留查询字符串参数。有查询字符串参数,它们是HTTP规范的一部分。并假设http://www.mysite.com/Status/Incoming?param1=val1&param2=val2&param3=val3网址是叫你不需要任何途径,使其映射到下面的动作(默认路由会做得很好):

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

默认模式将结合这些值护理。

+0

“没有遗留查询字符串参数这样的事情。”好的,好吧,但你知道我的意思。 :) Tnx,完美的作品! – 2011-03-12 15:11:42

0

当我不得不在现在处理这个时,我只是使用Request.QueryString的“传统”调用。它仍然有效,即使它不是很优雅。

1

为什么不使用捕获所有?

 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的方法将是最好的选择。