2012-04-25 57 views
2

背景:我試圖對MVC應用程序進行一些URL操作。我寫了一個HtmlHelper擴展方法,用另一個替換查詢字符串值。該方法採用當前的請求字符串,手動拆分查詢部分(以防止Foo = 1,Hello,World,2)被讀取爲Foo = 2,並且Foo = 1,並且Foo = Hello,%2c%20World!然後嘗試使用UriBuilder和Uri獲取URL。爲什麼Uri部分解碼查詢部分?

問題:出於某種原因,Uri.ToString部分解碼查詢字符串。作爲一個快速測試,我發射了LINQPad和運行以下:

var ub = new System.UriBuilder("http://foobar"); 
ub.Query = "NY%26A"; // NY&A 
ub.Uri.Dump(); 
ub.Uri.ToString().Dump(); 
ub.Uri.Query.Dump(); 
ub.ToString().Dump(); 

的結果是:

http://foobar/?NY&A 
http://foobar/?NY&A 
?NY%26A 
http://foobar:80/?NY%26A 

我說的部分解碼,因爲如果我用很多轉義字符,它解碼部分和離開他人的地方:

var ub = new System.UriBuilder("http://foobar"); 
ub.Query = "!%40%23%24%25%5E%26*()"; // [email protected]#$%^&*() 
ub.Uri.Dump(); 
ub.Uri.ToString().Dump(); 
ub.Uri.Query.Dump(); 
ub.ToString().Dump(); 

而且結果:

http://foobar/[email protected]%23$%25^&*() 
http://foobar/[email protected]%23$%25^&*() 
?!%40%23%24%25%5E%26*() 
http://foobar:80/?!%40%23%24%25%5E%26*() 

問題:有人可以解釋發生了什麼嗎?

回答

1

它似乎是使用「安全」解碼。在第二個例子中,它不會解碼#或%,因爲這會改變URI的結構/含義。

如果您不想讓解碼發生,請停止在URI上調用.ToString(),而是直接訪問您想要的組件。

+0

感謝您的答覆。我想知道它爲什麼會解碼,因爲這也會改變URI的含義。我的目標是能夠獲取現有的URI,更改某些內容並獲取完整的URI。沒有.NET類很容易,但我想知道發生了什麼。 – 2012-04-25 20:07:08

1

因爲URI不使用URL編碼

你可以用它來讀取原始或編碼值添加到URI對象:

 System.Web.HttpUtility.UrlDecode("NY%26A"); 
     System.Web.HttpUtility.UrlEncode("NY&A");