我的ASP.NET MVC3项目中有一些C#代码抛出了一个异常声明:
Cannot perform runtime binding on a null reference
抛出异常的代码行是:
ViewBag.Foo[i].Name = allSpark[i].Users.Name;
这是代码块:
ViewBag.Foo = new myAllSparkModelType[allSpark.Length];
for (int i = 0; i < allSpark.Length; i++)
{
ViewBag.Foo[i].Name = allSpark[i].Users.Name;
...
}
当我设置断点并检查allSpark[i].Users.Name
时,它肯定有一个值(例如“Fred”)。
如果我注释掉这行代码,那么下一行(类似的代码)会引发相同的异常。
所以问题是allSpark[i].Users.Name
是一个空引用(我已经确认不是)或者我不能像我一样使用ViewBag
。如果是后者,我很困惑,因为我认为ViewBag可以这样使用。
答案 0 :(得分:10)
看看这段代码:
ViewBag.Foo = new myDataModelType[allSpark.Length];
for (int i = 0; i < allSpark.Length; i++)
{
ViewBag.Foo[i].Name = ...
...
}
ViewBag.Foo
已初始化,但ViewBag.Foo
的每个元素将为null
,假设myDataModelType
是一个类。创建数组时,每个元素都初始化为元素类型的默认值 - 对于引用类型,该默认值为null。
您需要为每个元素创建一个新对象:
for (int i = 0; i < allSpark.Length; i++)
{
ViewBag.Foo[i] = new myDataModelType();
ViewBag.Foo[i].Name = ...
...
}
答案 1 :(得分:1)
如果allSpark[i].Users.Name
包含值,则可能是左侧引用该属性。
检查ViewBag.Foo
是否存在,然后检查它是否存在于位置i。
答案 2 :(得分:1)
ViewBag为null,因此.Foo [i]不存在 或者Foo为null并且索引它无效 或者Foo [i]为空,因此Foo [i] .Name无效
答案 3 :(得分:0)
在为其分配名称之前,您必须创建ViewBag.Foo [i]的实例。
ViewBag.Foo = new myDataModelType[allSpark.Length];
for (int i = 0; i < allSpark.Length; i++)
{
ViewBag.Foo[i] = new ObjectThatHasNameProperty();
ViewBag.Foo[i].Name = allSpark[i].Users.Name;
}
allSpark[i].Users.Name
有一个值,但ViewBag.Foo[i]
不是例外。