2013-10-29 34 views
2

有沒有在.NET框架類,如果給定的順序/枚舉的鍵值對(或任何其他的我不是剛性的這個格式)可以這樣創建一個查詢字符串:任何.NET類,使得查詢字符串給定的鍵值對或類似

?foo=bar&gar=har&print=1 

我能做到這一點簡單的任務自己,但我認爲我會問我自己免於重新發明輪子。爲什麼所有這些字符串操作都只需一行代碼就可以完成呢?

+0

對這樣一個問題的回答可以爲很多開發者節省很多寶貴的時間。 –

+0

不確定在RestSharp代碼庫中是否有任何具體的操作,但值得一看。 – sasfrog

+0

謝謝。我代表您添加了答案。 –

回答

6

您可以使用System.Web.HttpUtility.ParseQueryString創建一個空System.Web.HttpValueCollection,並使用它像一個NameValueCollection

例子:

var query = System.Web.HttpUtility.ParseQueryString(string.Empty); 
query ["foo"] = "bar"; 
query ["gar"] = "har"; 
query ["print"] = "1"; 
var queryString = query.ToString(); // queryString is 'foo=bar&gar=har&print=1' 
+1

相關:https://connect.microsoft.com/VisualStudio/feedback/details/356144/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll – sloth

+0

尼斯。感謝分享。 :-)我想這也是一個重要的決定,即移動公共API的一部分。這讓我想起了一種屬性,它告訴CLR這個入口點很重要,並且永遠不會改變,因爲它是公開發布的API的一部分。我忘記了屬性名稱。 –

1

據我所知,雖然有很多差不多 .NET框架沒有內置。

System.Web.HttpRequest.QueryString是預先解析NameValueCollection,不是一朝一夕所能輸出的查詢字符串。 System.NetHttpWebRequest期望您傳遞預先形成的URI,並且System.UriBuilder具有Query屬性,但同樣需要預先爲整個查詢字符串預先生成一個字符串。

然而,運行「querystringbuilder」快速搜索顯示了這一點,這樣就能滿足網絡一對夫婦實現了。一個這樣的是這一個Brad Vincent,它給你一個簡單流暢的界面:

//take an existing string and replace the 'id' value if it exists (which it does) 
//output : "?id=5678&user=tony" 
strQuery = new QueryString("id=1234&user=tony").Add("id", "5678", true).ToString(); 
0

而且,雖然不完全是很優雅,我在RestSharp發現了一個方法,通過@sasfrog在我的問題的意見建議。這是方法。

從RestSharp主\ RestSharp \ Http.cs

private string EncodeParameters() 
{ 
    var querystring = new StringBuilder(); 
    foreach (var p in Parameters) 
    { 
    if (querystring.Length > 0) 
     querystring.Append("&"); 

    querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode()); 
    } 

    return querystring.ToString(); 
} 

再次,不是很優雅,而不是真正我會一直期待,但是,嘿,它可以完成任務,並節省了我一些打字。

我真的尋找類似西環的回答(標明正確答案),但這個工程也是如此。

0

沒有什麼內置爲保留查詢參數的順序,據我所知.NET框架。以下幫助程序執行該操作,跳過空值,並將值轉換爲不變字符串。當與KeyValueList結合使用時,它使構建URI變得非常簡單。

public static string ToUrlQuery(IEnumerable<KeyValuePair<string, object>> pairs) 
{ 
    var q = new StringBuilder(); 
    foreach (var pair in pairs) 
     if (pair.Value != null) { 
      if (q.Length > 0) q.Append('&'); 
      q.Append(pair.Key).Append('=').Append(WebUtility.UrlEncode(Convert.ToString(pair.Value, CultureInfo.InvariantCulture))); 
     } 
    return q.ToString(); 
} 
相關問題