Dictionary.ContainsKey引发KeyNotFoundException

时间:2015-12-04 22:59:53

标签: c# asp.net-mvc razor

我正在使用ASP.Net MVC和razor创建一个网页。在我的cshtml文件中,我正在检查字典中是否存在密钥。如果密钥不存在,页面崩溃,我得到一个KeyNotFoundException。

我的模特

Dictionary<string,string> MyDictionary = new Dictionary<string,string>(){
 { "ValidKey", "ValidValue"}
};

CSHTML代码

@if (Model.MyDictionary.ContainsKey("ValidKey")) {
  <span>@Model.MyDictionary["ValidKey"]</span>
}
@if (Model.MyDictionary.ContainsKey("InvalidKey")) {
  <span>@Model.MyDictionary["InvalidKey"]</span>
}

第一次检查工作正常,但第二次检查崩溃。我不明白为什么在尝试检查密钥时会得到KeyNotFoundException。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我的猜测是一个错字 - 也许是套管?我知道这听起来微不足道,但我一直都在看......

您也可以尝试将其写为

@{ string result; }
@if (Model.MyDictionary.TryGetValue("ValidKey", out result)) {
<span>@result</span>
}

避免重复密钥的可能性,以及两次执行字典的次要性能问题。

答案 1 :(得分:0)

根据MSDN documentation ContainsKey实际上从不抛出KeyNotFoundException,这在直觉上是有意义的,因为ContainsKey的重点是检查密钥是否存在。

使用我自己的代码进行测试以尝试复制问题并未显示任何问题:

var dict = new Dictionary<string, string>();
dict.Add("ValidKey", "Valid Value");

string validKey = "ValidKey";
string invalidKey = "InvalidKey";

//Outputs "Valid Value"
if (dict.ContainsKey(validKey))
{
    Console.WriteLine(dict[validKey]);
}
//Outputs nothing and throws no exception
if (dict.ContainsKey(invalidKey))
{
    Console.WriteLine(dict[invalidKey]);
}

请注意,我正在设置变量的键,以避免潜在的问题@Steve Cooper在他的回答中指出。

正如您所发生的那样,您不小心尝试访问的密钥与您实际检查的密钥不同,正如@Steve Cooper建议的那样,所以检查拼写错误