2016-08-14 87 views
0

首先讓我解釋一下我的意思:我發現了很多方法,但其中大多數方法最終都會使用字符串操作和類似的東西。我想知道是否有一種使用內置函數的簡單方法。如何正確更改網址參數?

到目前爲止,我改變URL的參數與string myNewValue

Uri myUri = new Uri(URL); 
var qs = HttpUtility.ParseQueryString(myUri.Query); 
qs["ParameterName"] = myNewValue; 

這確實工作得很好。現在我想用這些新參數將我的URL帶回string。什麼是正確的方法來做到這一點?就像從我的原始字符串獲取URL沒有模式併合並獲得的參數?

注:到目前爲止,我能夠與Substring和這樣做,我只是覺得它「不潔」當一個人開始找到字符串中的字符從中Substring東西。

我該怎麼做很簡單。從我原來的網址我子串到「?」,然後我與qs.ToString()

回答

1

UriBuilder類是否提供給你足夠的權力?它沒有做的一切(特別是,它並沒有構建路徑),但失位很容易填補例如,默認的KeyValuePair<string, string>ToStringstring.Join()效果很好。

var myUri = new Uri(url); 
var qs = HttpUtility.ParseQueryString(myUri.Query); 
qs["param1"] = "newVal1"; 

var path = string.Join("&", qs); // UriBuilder can't do this bit for you 
// But it can put the bits back together and look after oddities, 
// slashes, url encoding, etc. 
var builder = new UriBuilder(myUri) {Path = path}; 
var newUri = builder.Uri; 

對於額外的整潔在你的代碼,這可能會在一個擴展方法包裹起來,就像這樣:

public static Uri SetAttribute(this Uri uri, string key, string value) { 
    var qs = HttpUtility.ParseQueryString(uri.Query); 
    qs[key] = value; 
    return new UriBuilder(myUri) {Path = string.Join("&", qs)}.Uri; 
} 

現在的原代碼變爲:

Uri myUri = new Uri(URL); 
myUri.SetAttribute("ParameterName") = myNewValue; 
+0

謝謝!我比我更喜歡這種方法。太糟糕了,沒有一個類可以做到這一切...我認爲從一個URL替換參數是常見的東西... – Cher

+1

是的,但我想他們選擇不重複'string的功能。加入()'和'KeyValuePair.ToString()'。你可以爲'Uri'添加一個簡單的擴展方法來爲你做。 –

+1

我剛剛瀏覽了[這個受歡迎的問題]中的解決方案(http://stackoverflow.com/q/829080/3195526)。我只能假定在編寫這些答案時UrlBuilder不存在。特別是對這個問題的評論表明它在2013年並不存在。 –