Возможно, есть гораздо более простые способы сделать это, но вот один из подходов ...
Создание собственного обработчика маршрута. Получение QueryString[0]
не будет работать, если строка URL-адреса-запроса включает в себя саму строку запроса. Поскольку последнее «=», если оно не закодировано, будет интерпретировано как начало значения запроса.
т.е. http://mysite.com/view/?http://www.youtube.com/?whatever=something
приведет к something
.
Итак, вместо этого мы сами разбираем URL:
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);
}
Пример URL:
http://mysite.com/view/?http://www.youtube.com?whatever=something
... позвонит:
WhateverController::View("http://www.youtube.com?whatever=something");
Пахнет "немного", как злоупотребление схемой URL, но должно работать.