1

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

我在控制器中为 ViewBag 变量 AvailableDocuments 分配一个集合(字典)并在视图中迭代它。我可以很好地完成第一个循环,但是当代码到达第二个 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 循环(以填充三个下拉菜单)。唯一改变的是 Documents 的索引(不为空)。

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)<--换行
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

4

2 回答 2

2

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

在您后面的代码中,在分配上添加一个 ToList() 并查看是否可以解决问题。:

ViewBag.Product.Documents = something.GetProductDocuments.ToList();
于 2013-01-15T16:01:13.537 回答
1

如果您使用所需数据创建 pocos 集合会发生什么,可能就像这样简单

public class OptionItem
{
   public int Id {get; set;}
   public string Text {get; set;}
}

并将其添加到视图模型上的集合并将其传递给视图?这样您就知道所有数据在您查看视图之前都是他们的。我个人会避免将 viewbag 用于这样的事情。

于 2013-01-15T16:12:00.443 回答