填充列表时非foreach循环的NullReferenceException(非空)

时间:2017-04-10 23:37:53

标签: c# asp.net-mvc

我打算就这个非常特殊的问题写一个问题,但在写这个问题的同时找到了我自己的答案。所以我想我会继续发布这个以便其他人的利益并在下面给出我的答案。

我在视图中有以下foreach循环:

foreach(CustomObject rt in Model.CustomObjectList1) {
   ...
}
foreach(CustomObject rt in Model.CustomObjectList2) {
   ...
}
foreach(CustomObject rt in Model.CustomObjectList3) {
   ...
}
foreach(CustomObject rt in Model.CustomObjectList4) {
   ...
}
foreach(CustomObject rt in Model.CustomObjectList5) {
   ...
}
foreach(CustomObject rt in Model.CustomObjectList6) {
   ...
}

Model.CustomObjectList1到Model.CustomObjectList6都被定义为List<CustomObject>,因为我必须将这些自定义对象放入不同的桶中并遍历每个桶以在视图上显示。

在今天之前,这段代码已经很好地运行了很长时间。今天,我对视图进行了编辑,在页面末尾的循环中添加了以下隐藏的输入字段

<input type="hidden" id="otherObjectId" name="otherObjectId" value="@Model.OtherObject.ID" />

在进行了更改并尝试测试我的更改后,我现在在迭代Model.CustomObjectList6后得到NullReferenceException错误。

调试,我可以看到它循环遍历所有填充Model.CustomObjectList6的对象,然后在到达应该是最后一次迭代的结尾之后,代码执行返回到foreach循环的顶部并抛出NullReferenceException,调试器突出显示循环声明中的“in”。

我只在Model.CustomObjectList6上遇到此问题。列表1-5迭代正常,没有错误。我也尝试将不同的数据集加载到此视图中,因为不同的用户在设计上会得到不同的结果,并且问题仍然存在。

例如,如果列表中有10个对象,我会逐步遍历10个对象中的每个对象,然后得到错误,好像它正在尝试执行不存在的第11次迭代。

最重要的是,即使我将迭代更改为这样的标准循环(因为我知道Model.CustomObjectList6恰好包含10个非空项)...

for(int x=0; x<10; x++) {
   CustomObject rt = Model.CustomObjectList6[x];
   ...
}

...我仍然得到NullReferenceExceptionError,调试器突出显示x<10作为NullReferenceException错误的点。我可以看到它在10次正确的迭代中循环,回到顶部(它突出显示x ++),下一步它尝试评估x&lt; 10,然后抛出错误。

1 个答案:

答案 0 :(得分:-1)

答案实际上就是新的隐藏输入字段。我不确定为什么它表现了它对for / each循环的NullReferenceError的方式,但在将页面恢复到预编辑版本之后它再次开始工作。

我再次添加了输入字段,这次运行页面时,新输入字段上发生了NullReferenceException,这使我能够识别出OtherObject为空。

填充OtherObject解决了这个问题。为什么NullReferenceException出现在循环而不是新的输入字段上,我不知道,特别是因为在循环结束和新字段之间模型中的值填充了5个其他隐藏字段。