【问题标题】:Manipulating QueryStrings in .NET在 .NET 中操作查询字符串
【发布时间】:2011-09-20 23:41:37
【问题描述】:

我在 StackOverflow 上看到了多个示例和答案,解释说这是创建要操作的 QueryString 的推荐方法。

NameValueCollection test = HttpUtility.ParseQueryString(String.Empty);
test.Add("hello", "world");
Console.WriteLine(test.ToString());

但它返回的只是

System.Collections.Specialized.NameValueCollection

发生了什么事?用于测试的简单 .NET4 控制台应用程序(也尝试过早期的框架)。如果我不给它一个空字符串,它就会开始工作,但有这么多帖子推荐它作为解决方案似乎很奇怪。也将其包装在 try/catch 语句中,以查看是否发生了任何奇怪的事情,不会引发异常。我真的应该只给它一个随机字符串“a = b”,然后将其从 NameValueCollection 中删除以获得可用的 HttpValueCollection?

我的最终目标是将它与 UriBuilder 一起使用,从中获取 Query 属性并将其提供给 ParseQueryString。但是有时可能没有查询字符串,UriBuilder.Query 会返回一个空字符串......因此出现了这个问题。

编辑:如果有人感到困惑,我打算打印出来的是与集合等效的查询字符串。因此,如果我要为集合添加另一个值

test.Add("other", "value");

ToString() 方法的结果应该是

"hello=world&other=value"

编辑你好,戴夫 我的主张?为什么它不起作用...

【问题讨论】:

  • 您使用的是哪个版本的 .NET?
  • 这对我来说很好用。我从问题中获取了您的确切代码,它产生了您想要的结果。如果我不打电话给Add,那么当我打电话给ToString()时会得到一个空字符串
  • 尝试了所有 .NET 版本:1.1、2、3、3.5 和 4。但是我在 Mono(在 linux 中)上运行。刚开始找一个 Windows 测试环境,果然可以用。一定是 Mono 的 System.Web 中的一个 bug :(
  • 哇。很高兴知道。祝你好运!
  • Nicholi,你是个好人,我喜欢你穿着的 android 头像,但下次请从头开始告诉你你在另一个平台上,用如此重要的细节标记你的问题,或者我给你一个 iPhone!

标签: c# .net linux mono query-string


【解决方案1】:

您的代码错误,要打印测试内容,您应该这样做:

foreach(string s in test.AllKeys)
{
  Console.WriteLine("{0}-{1}", s, test[s]);
}

编辑:我不明白你的意思 Nicholi,看这张图片,我得到了正确的类 HttpValueCollection 也是从 parse 方法中的空字符串开始,而不是添加 hello 键,看我的 test.Add 被注释掉了,AllKeys 是空的。

所以我的test.ToString() 是空的,不是 System.Collections.Specialized.NameValueCollection 正如你在问题中提到的那样。

您还想要/需要/询问/声明什么? ;-)

【讨论】:

  • 您能否详细说明为什么要打印System.Collections.Specialized.NameValueCollection?你说了要做什么,但没有说为什么要这样做。
  • @Davide,您似乎将 ParseQueryString 的返回值视为普通的旧 NameValueCollection。这是不正确的,它实际上返回了一个 HttpValueCollection(派生自 NameValueCollection),它覆盖了 ToString 方法以返回......一个查询字符串。所以它应该打印出来的是“hello=world”。如果我向集合中添加另一个值,它将是“hello=world&other=value”。你知道......就像一个查询字符串。据我了解,这是 HttpUtility.ParseQueryString() 方法的全部目的。否则我会自己做一个 NameValueCollection 来做到这一点。
  • Nicholi 如果你说的是真的,为什么当他按照问题最初所述的方式执行 ToString 时 op 会得到 System.Collections.Specialized.NameValueCollection?
  • 我是运营商,我不知道。这就是为什么它如此令人困惑。如果您向 ParseQueryString() 提供除空字符串以外的任何内容,它将起作用。但是有很多 StackOverflow 的答案都给出了具体的答案。我并没有真正开始的初始查询字符串值,这就是为什么在构造中简单地添加一个但之后立即删除它似乎是多余的。
【解决方案2】:

显然这是 Mono 中的一个古老错误(我在问题中忘记提及了!!)。 我使用 Mono 2.10.5 和 MonoDevelop 2.6。 微软的 System.Web 似乎没有问题。

Just got it fixed now.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多