有沒有在.NET框架類,如果給定的順序/枚舉的鍵值對(或任何其他的我不是剛性的這個格式)可以這樣創建一個查詢字符串:任何.NET類,使得查詢字符串給定的鍵值對或類似
?foo=bar&gar=har&print=1
我能做到這一點簡單的任務自己,但我認爲我會問我自己免於重新發明輪子。爲什麼所有這些字符串操作都只需一行代碼就可以完成呢?
有沒有在.NET框架類,如果給定的順序/枚舉的鍵值對(或任何其他的我不是剛性的這個格式)可以這樣創建一個查詢字符串:任何.NET類,使得查詢字符串給定的鍵值對或類似
?foo=bar&gar=har&print=1
我能做到這一點簡單的任務自己,但我認爲我會問我自己免於重新發明輪子。爲什麼所有這些字符串操作都只需一行代碼就可以完成呢?
您可以使用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'
相關:https://connect.microsoft.com/VisualStudio/feedback/details/356144/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll – sloth
尼斯。感謝分享。 :-)我想這也是一個重要的決定,即移動公共API的一部分。這讓我想起了一種屬性,它告訴CLR這個入口點很重要,並且永遠不會改變,因爲它是公開發布的API的一部分。我忘記了屬性名稱。 –
據我所知,雖然有很多差不多 .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();
而且,雖然不完全是很優雅,我在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();
}
再次,不是很優雅,而不是真正我會一直期待,但是,嘿,它可以完成任務,並節省了我一些打字。
我真的尋找類似西環的回答(標明正確答案),但這個工程也是如此。
沒有什麼內置爲保留查詢參數的順序,據我所知.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();
}
對這樣一個問題的回答可以爲很多開發者節省很多寶貴的時間。 –
不確定在RestSharp代碼庫中是否有任何具體的操作,但值得一看。 – sasfrog
謝謝。我代表您添加了答案。 –