我们的ASP.NET MVC 3使用一个模型,该模型通过名为Fields的属性公开System.Collections.Generic.Dictionary,我们使用字符串作为键。
我们注意到抛出了一个KeyNotFoundException - 但是对于我们知道的字符串键就在那里!
这个循环,当我们在字典中有3个项目时:
var ee = Model.Fields.GetEnumerator();
while (ee.MoveNext())
{
logger.ErrorFormat("STRANGE ERROR: '{0}'", ee.Current.Key);
logger.ErrorFormat("STRANGE ERROR: {0}", ee.Current.Key.GetHashCode());
}
产地:
STRANGE ERROR: 'title'
STRANGE ERROR: -1859741728
STRANGE ERROR: 'link'
STRANGE ERROR: 325350890
STRANGE ERROR: 'view'
STRANGE ERROR: 1582259101
然而,以下是错误的:
Model.Fields.ContainsKey("title") // Is False (incorrectly)
我想知道哈希码是否不同,所以尝试了:
string t = "title";
logger.ErrorFormat("STRANGE ERROR: {0}", t.GetHashCode());
产生:
-1859741728
所以我知道Dictionary包含我的项目和字符串键哈希到相同的代码,为什么我不能访问Dictionary项目?
更新
继承视图代码以提供一些上下文。这段代码粗糙(!)是一些非常快速诊断的产物!
@using System.Xml.Serialization;
@using System.Text;
@using log4net;
@model IComponent
@{
string title = String.Empty;
var logger = log4net.LogManager.GetLogger(typeof(ContentModel.Component));
logger.Error("STRANGE ERROR: CHECK TITLE");
// Key in dictionary?
if (Model.Fields.ContainsKey("title"))
{
logger.Error("STRANGE ERROR: CHECK TITLE: YES!");
title = Model.Fields["title"].Value;
}
else
{
// No, loop through what fields we have
var ee = Model.Fields.GetEnumerator();
while (ee.MoveNext())
{
logger.ErrorFormat("STRANGE ERROR: '{0}'", ee.Current.Key); // 'title' appears - but failed above WTF!!!!
logger.ErrorFormat("STRANGE ERROR: {0}", ee.Current.Key.GetHashCode());
}
string t = "title";
logger.ErrorFormat("STRANGE ERROR: {0}", t.GetHashCode());
}
}
<h3>@title</h3>