我正在使用第三方服务,该服务对我提供给他们的网址执行异步回调。 所以我告诉他们使用http://www.mysite.com/Status/Incoming。 这显然必须映射到我的StatusController上的Incoming()方法。
然而,我无法控制的是他们称之为URL的参数的格式。 例如。他们将进行回调,例如:http://www.mysite.com/Status/Incoming?param1=val1¶m2=val2¶m3=val3
我想将此映射到我的操作方法的参数:Incoming(string param1,string param2,int param3)
我该怎么做?
我发现很多关于自定义路由的内容,但没有关于遗留QueryString参数的内容。
答案 0 :(得分:8)
没有遗留查询字符串参数这样的东西。有查询字符串参数,它们是HTTP规范的一部分。假设调用了http://www.mysite.com/Status/Incoming?param1=val1¶m2=val2¶m3=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的“遗留”调用。它仍然有效,即使它不是很优雅。