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

本文关键字:我的 for 循环 不喜欢 应用程序 NET MVC ASP | 更新日期: 2023-09-27 17:53:11

前几天我重写了我的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

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

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

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

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

如果使用所需的数据创建pocos集合,会发生什么呢?

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

并将其添加到视图模型上的集合并将其传递给视图?这样,在进入视图之前,你就知道所有的数据都是他们的。我个人会避免在这种情况下使用viewbag。