给出如下的网址:
mysite.com/view/?http://www.youtube.com/
是否可以在操作的参数中捕获查询字符串值。
public ActionResult View(string query = "")
{
...
}
我可以通过调用QueryString[0]
来获取该值,这很好。
当查询字符串具有如下键时,它可以正常工作:
mysite.com/view/?query=http://www.youtube.com/
public ActionResult View(string query = "")
{
...
}
但是我试图在没有钥匙的情况下这样做。
修改:更新问题以反映我正在做的事情。我将URL作为未编码的url作为查询字符串参数传递。
答案 0 :(得分:0)
为什么不使用路由参数而不是查询字符串?
MapRoute(null, "view/{*urlParam}", ...
然后,您可以在不使用查询字符串的情况下将值作为操作方法的参数获取:
mysite.com/view/http://www.youtube.com/
public ActionResult View(string urlParam = "")
{
...
}
答案 1 :(得分:0)
可能有更简单的方法可以做到这一点,但这是一种方法......
制作自定义路线处理程序。如果URL-as-querystring本身包含查询字符串,则获取QueryString[0]
将无法正常工作。因为最后的“=”,如果未编码,将被解释为查询值的开头。
即。 http://mysite.com/view/?http://www.youtube.com/?whatever=something
会产生something
。
因此,我们自己解析网址:
public class NoKeyQueryStringHandler : MvcRouteHandler
{
private string routeDataKey;
// routeDataKey: the key to use for storing our query in routeData.Values
public NoKeyQueryStringHandler(string routeDataKey)
{
this.routeDataKey = routeDataKey;
}
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string[] parts = requestContext.HttpContext.Request.Url
.OriginalString.Split(new [] {'?'}, 2);
string value = parts.Length > 1 ? parts[1] : "";
requestContext.RouteData.Values[routeDataKey] = value;
return base.GetHttpHandler(requestContext);
}
// Handler that doesn't take care of querystring-in-querystring:
/*
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
NameValueCollection query =
requestContext.HttpContext.Request.QueryString;
string value = query.Count > 0 ? query[0] : "";
requestContext.RouteData.Values[routeDataKey] = value;
return base.GetHttpHandler(requestContext);
}
*/
}
注册路线的处理程序:
routes.Add(new Route(
"view",
new RouteValueDictionary(new { controller = "Whatever", action = "View"}),
new NoKeyQueryStringHandler("url")
)
);
动作:
// Might not want to hide Controller::View, but oh well...
public ActionResult View(string url)
{
return Content(url);
}
网址示例:
http://mysite.com/view/?http://www.youtube.com?whatever=something
...将致电:
WhateverController::View("http://www.youtube.com?whatever=something");
闻起来有点像滥用URL方案,但应该有用。