ASP.NET MVC应用程序不喜欢我的for循环

时间:2013-01-15 15:28:05

标签: c# asp.net-mvc

前几天我重写了一部分MVC应用程序,现在我得到一个RuntimeBinderException,声明'无法对空引用执行运行时绑定'。

我在Controller中为ViewBag变量AvailableDocuments分配一个集合(Dictionary),并在View中迭代它。我可以通过第一个循环完成它,但是当代码到达第二个for循环的出口点时,它会抛出此异常。我已经用几种不同的方式重写了这一点,并且总是遇到同样的问题。我可以摆脱这个异常的唯一方法是从这个视图中删除第二个/第三个循环。此外,我使用调试器来验证我没有在集合中接收任何空值,并且第一个循环不是(无缘无故)对此集合执行更改。

@foreach (KeyValuePair<int, string> doc in ViewBag.AvailableDocuments)
{
    <option value="@doc.Key" @((ViewBag.Product.Documents[0].OriginalDocID == doc.Key) ? "selected" : "")>@doc.Value</option>
}

这是重复三次的for循环(填充三个下拉列表)。唯一改变的是Document的索引(非空)。

Line 62: <select name="Doc1" style="width:300px;">
Line 63: <option value="-1">Don't Display a Document</option>
Line 64: @foreach (KeyValuePair<int, string> doc in ViewBag.AvailableDocuments) &lt; - BREAK LINE
Line 65: {
Line 66: <option value="@doc.Key" @((ViewBag.Product.Documents[0].OriginalDocID == doc.Key) ? "selected" : "")>@doc.Value</option>

信息:

Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference

2 个答案:

答案 0 :(得分:2)

您是从数据库还是Web服务中读取ViewBag.Product.Documents中的数据?如果是这样,我猜你正在遇到延迟加载的问题(在需要之前不会请求数据)。发生异常是因为在请求数据时,源不再可用。

在你的代码中,在赋值中添加一个ToList(),看看是否能解决问题。:

ViewBag.Product.Documents = something.GetProductDocuments.ToList();

答案 1 :(得分:1)

如果您创建具有所需数据的pocos集合会发生什么,可能就像这个

一样简单
public class OptionItem
{
   public int Id {get; set;}
   public string Text {get; set;}
}

并将其添加到视图模型的集合中并将其传递给视图?通过这种方式,您可以在进入视图之前知道所有数据。我个人会避免使用viewbag这样的东西。