2012-02-04 51 views
1

給出一個網址,如:MVC行動與查詢字符串參數沒有密鑰

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

有了像你這樣的網址mysite.com/view/?123 - 這不會給你一個查詢字符串變量的名稱(鍵)123和一個空值嗎?所以它仍然不是沒有鑰匙,它沒有價值。 – 2012-02-04 13:31:12

+0

@ChristoferEliasson我更新了我的問題,以反映我在做什麼。不,它會給出一個具有值的空鍵。 – Phill 2012-02-04 13:32:47

回答

0

有可能有更簡單的方法來做到這一點,但這裏有一種方法...

做一個自定義的路由處理程序。如果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方案的虐待,但應該工作。

0

爲什麼不使用路由參數而不是查詢字符串呢?

MapRoute(null, "view/{*urlParam}", ... 

然後,您可以得到值作爲參數傳遞給您的操作方法不使用查詢字符串:

mysite.com/view/http://www.youtube.com/

public ActionResult View(string urlParam = "") 
{ 
... 
} 
+0

URL參數需要進行編碼,並將URL作爲查詢字符串傳遞。試圖解決問題,而不必讓別人改變事情。 – Phill 2012-02-04 13:58:31

+0

請注意,實際上可能會傳遞未編碼的網址。請參閱[Hanselman的博客文章](http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx)。但如果你想保留它作爲查詢,請參閱我的答案。 – JimmiTh 2012-02-04 15:01:19