2014-02-05 20:53

[C#] HttpUtility.ParseQueryString 的隱藏密技

在使用 Request.QueryString 發現 ToString 會產生 URL 的 query 字串,嘗試用 NameValueCollection 的 ToString 卻不是產生 URL 的 query 字串,這一整個就很奇怪,明明都是 NameValueCollection 確有不一樣的結果,透過 Reflector 發現 Request.QueryString 的 instance 型別是一個 HttpValueCollection,想說可以直接 new HttpValueCollection 出來使用,但 HttpValueCollection 卻是 System.Web 的內部 Class,外部是無法直接 new 出來使用,還好在又發現 HttpUtility.ParseQueryString 回傳的 NameValueCollection 的 instance 是 HttpValueCollection 這個型別,所以可以透過 HttpUtility.ParseQueryString 來建立 HttpValueCollection。

  1. // using System.Web; 
  2.  
  3. var qs1 = HttpUtility.ParseQueryString("id=5&type=1"); 
  4. qs1.ToString(); // "id=5&type=1" 
  5.  
  6. var qs2 = HttpUtility.ParseQueryString(String.Empty); 
  7. qs2["id"] = "11"; 
  8. qs2["name"] = "Tom";  
  9.  
  10. qs2.ToString(); // "id=11&name=Tom" 


HttpValueCollection 的簽名
  1. [Serializable]      
  2. internal class HttpValueCollection : NameValueCollection      
  3. { 
  4. } 


ParseQueryString 的簽名
  1. public static NameValueCollection ParseQueryString(string query, Encoding encoding) 
  2. { 
  3.    if (query == null) 
  4.    { 
  5.        throw new ArgumentNullException("query"); 
  6.    } 
  7.    if (encoding == null) 
  8.    { 
  9.        throw new ArgumentNullException("encoding"); 
  10.    } 
  11.    if ((query.Length > 0) && (query[0] == '?')) 
  12.    { 
  13.        query = query.Substring(1); 
  14.    } 
  15.    return new HttpValueCollection(query, false, true, encoding); 
  16. } 

0 回應: