2017-10-12 57 views
2

我有一个NameValueCollection变量queryDictNameValueCollection键没有值

某些键没有值。不过,我想要通过所有键,即使它们没有与它们相关的值。

利用这一点,我得到空的,而不是键值名称,如果为空值:

foreach (var parameter in queryDict) 
{ 
    key = (string)parameter; 
} 

AllKeys产生的所有结果。

但是我也得到null。看看queryDict的内容,我可以看到字符串的值在那里...

那么我怎样才能访问所有的密钥名称,而无需创建算法?

增加:

这里是的QueryDict的用鼠标悬停当内容:

{AQB = 1个& NDH = 1个& CID。 & oxygenid}

cid。和oxygenid没有在循环

发现我充满这样说:

string queryString = "AQB=1&ndh=1&cid.&oxygenid"; 
NameValueCollection queryDict = System.Web.HttpUtility.ParseQueryString(queryString); 
+0

一个NameValueCollection中,您可以用相同的键添加多个值,但是如果你添加一个键一个空值和然后再次读取具有非空值的相同密钥,第一个不再可用 – Steve

回答

3

NameValueCollection允许您使用同一个键添加多个值,但如果您添加一个空值的键,然后再次读取具有非空值的同一个键,则第一个值(空值)没有更多的可用

让我们测试的一些场景:

NameValueCollection coll = new NameValueCollection(); 
coll.Add("This", "Test"); 
coll.Add("That", "A value"); 
coll.Add("This", "Not a null"); 

foreach (string p in coll.AllKeys) 
{ 
    Console.WriteLine("Key=" + p + ", Value=[" + (coll[p] ?? "null") + "]"); 
} 

我们得到的,作为输出,

Key=This, Value=[Test,Not a null] 
Key=That, Value=[A value] 

所以对象合并了两个值罪加gle条目用逗号分隔两个值。 现在让我们尝试用

coll.Add("This", null); 
coll.Add("That", "A value"); 
coll.Add("This", "Not a null"); 

输出是

Key=This, Value=[Not a null] 
Key=That, Value=[A value] 

没有第一添加的痕迹。为什么会发生?只是因为合并值的Add方法的内部逻辑无法区分null的初始值和第一个add所添加的null。所以它只是用“Not a null”字符串替换空值。

事实上征求意见的最后添加

coll.Add("This", null); 
coll.Add("That", "A value"); 
// coll.Add("This", "Not a null"); 

我们得到

Key=This, Value=[null] 
Key=That, Value=[A value] 
+0

感谢您的解释。我试过这段代码,你说得对。它似乎是由于我填写它的方式(我对我的文章做了补充)。有没有办法使用ParseQueryString,所以没有值的参数不会被忽略? – Cher

+0

那么,ParseQueryString会将没有值的参数视为空字符串(“”)而不是空值。所以是的,如果没有值,它会返回一个空字符串的键。但是您的示例输入无效。要正确使用ParseQueryString,您应该有_“AQB = 1&ndh = 1&cid =&oxygenid =”; _ – Steve

+0

特别是,这样可以更好地解释您的一些问题。当您将字符串_“AQB = 1&ndh = 1&cid。&oxygenid”_传递给ParseQueryString时,您将得到集合中的第三个键“null”,并将两个字符串作为值“cid”。和“oxygenid”。这似乎表明ParseQueryString无法确定键并将输入用作空键的值。 – Steve

0

I would like to go through all keys你应该通过按键环路,则:

foreach (var parameter in queryDict.Keys) 
+0

我所做的是相同的。我仍然没有得到没有参数的密钥 – Cher

0

试试这个,看看它是否工作。您可以使用NameValueCollection.AllKeys来循环使用密钥,而不会返回任何重复。

foreach (var parameter in queryDict.AllKeys) { key = parameter; } 
+0

它没有返回值为空的密钥。它和我所做的一样。 – Cher

+0

你可能在对象中有'null keys'。 'NameValueCollection'允许重复/空键。否则,这应该工作。 – Anonymous

+0

该键不为空。我将在一分钟内添加queryDict – Cher

0

使用?? ??空合并运算符。如果操作数不为null,则返回左侧的操作数;否则返回右手操作数。

+0

的内容,谢谢!我可以问我在哪里写代码? – Cher