有可能有更簡單的方法來做到這一點,但這裏有一種方法...
做一個自定義的路由處理程序。如果URL-as-querystring自身包含查詢字符串,那麼獲取QueryString[0]
將不太合適。因爲最後的「=」,如果未編碼,將被解釋爲查詢值的開始。
I.e. 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方案的虐待,但應該工作。
有了像你這樣的網址mysite.com/view/?123 - 這不會給你一個查詢字符串變量的名稱(鍵)123和一個空值嗎?所以它仍然不是沒有鑰匙,它沒有價值。 – 2012-02-04 13:31:12
@ChristoferEliasson我更新了我的問題,以反映我在做什麼。不,它會給出一個具有值的空鍵。 – Phill 2012-02-04 13:32:47