23

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

Request.QueryString.ToString 

给了我类似的东西:&hello=worldµsoft=sucks

但是,当我使用此代码将集合克隆到另一个对象(相同类型)时,我会从 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());

有没有一种更整洁的方式来输出它而不是手动查找和构建字符串?

4

6 回答 6

69

HttpValueCollection 是内部的,但您可以使用“var”来声明它,而无需使用反射器提取它。

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
于 2009-09-15T07:43:56.787 回答
8

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

于 2008-10-23T14:35:10.613 回答
4

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

于 2008-10-23T14:32:20.977 回答
2

为什么要将 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");
于 2008-10-23T14:30:16.987 回答
1

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

var variables = Request.QueryString.OfType<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);
于 2008-10-23T15:07:10.517 回答
0

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

尽管如此,HttpValueCollection 是从 NameValueCollection 派生的,并且它的 Remove() 方法保持不变,因此您应该能够调用 Request.QueryString.Remove("sid");

于 2008-10-23T14:30:42.870 回答