在c#中输出一个受控的QueryString

使用以下代码我得到一个很好的格式化字符串:

Request.QueryString.ToString 

给我一些类似的东西:&hello = world&microsoft =糟透了

但是,当我使用此代码将集合克隆到另一个对象(相同类型)时,我从ToString()方法返回Type()。

 System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString); if (!string.IsNullOrEmpty(variables["sid"])) variables.Remove("sid"); Response.Write(variables.ToString()); 

是否有更整洁的输出方式,而不是手动查看和构建字符串?

您还可以使用Reflector将HttpValueCollection类提取到您自己的类中,然后使用它。

HttpValueCollection是内部的,但您可以使用“var”声明它而不用reflection器提取它。

 var query = HttpUtility.ParseQueryString(Request.Url.Query); query["Lang"] = myLanguage; // Add or replace param string myNewUrl = Request.Url.AbsolutePath + "?" + query; 

因为它实际上是一个特殊的NVC,类型为HTTPValueCollection。 所以当你在它上面调用.ToString时,它知道如何正确地格式化它。

为什么要将QueryString集合复制到新的NameValueCollection中?

  if (!string.IsNullOrEmpty(Request.QueryString["sid"])) Request.QueryString.Remove("sid"); 

是的,我错了,它是只读的。 所以本质上是在NameValuecollection上使用Remove方法:

 System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString); if (!string.IsNullOrEmpty(variables["sid"])) variables.Remove("sid"); 

如果您不是绝对需要NameValueCollection,则字典提供了许多相同的语义:

 var variables = Request.QueryString.OfType() .Where(entry => entry.Key != "sid") .ToDictionary(entry => entry.Key, entry => entry.Value); 

Request.QueryString实际上返回一个HttpValueCollection对象(不幸的是,它是System.Web的内部,所以你不能这样做)。

然而,HttpValueCollection是从NameValueCollection派生的,它的Remove()方法保持不变,所以你应该能够调用Request.QueryString.Remove(“sid”);