这是错误的,为啥不是? ASP.NET MVC 视图包

Posted

技术标签:

【中文标题】这是错误的,为啥不是? ASP.NET MVC 视图包【英文标题】:Is this wrong and why it's not ? ASP.NET MVC ViewBag这是错误的,为什么不是? ASP.NET MVC 视图包 【发布时间】:2017-07-11 12:49:39 【问题描述】:

这是我的代码示例,我在其中显示有关我的客户的信息:

<table class="table table-striped  jambo_table bulk_action">
   <thead>
      <tr class="headings">
         <th class="column-title">Address </th>
         <th class="column-title">Title</th>                                            
      </tr>
   </thead>
   <tbody>
    @foreach (var customer in ViewBag.Customers)
    
     <tr>
      <td>@customer.Code</td>
      <td>@customer.DefaultName.Name</td>
     </tr>
    
   </tbody>
</table>

正如你们所看到的,我正在循环访问ViewBag 以在我的表格中显示一些数据, 我在ViewBag.Customer中没有数据的情况下测试了它,它没有抛出任何异常, foreach 怎么没有在空列表上抛出异常?

我想我会得到类似的东西:

对象引用未设置为对象的实例

如果我在没有数据的情况下尝试遍历ViewBag.Customer..

怎么会?

【问题讨论】:

向我们展示你的控制器类。全班同学。 如果它是一个空列表,它不会抛出错误。如果它是 null 应该有一个错误(我认为)。 为什么不使用 ViewModel 将所有属性传递给强类型视图? 【参考方案1】:

Foreach 循环调用GetEnumerator 方法。如果它是空枚举器,它不会抛出错误(即:它只是退出循环)。

如果集合为空,则此方法调用会导致NullReferenceException,因为它无法获取枚举数。在这种情况下,您的控制器必须返回一个空列表,以免引发错误。

【讨论】:

我刚刚意识到我的控制器正在从数据库中返回客户列表,如果没有项目的话,实际上是在返回空列表。所以是的,你的答案是正确的,ž 列表不为空它是空的..【参考方案2】:

正如@hsoesanto 所说,IEnumerable 调用 GetEnumerator,它返回 IEnumerator 的实例,但如果集合为空,它不会抛出任何异常。

这是ICollection的原始代码

[__DynamicallyInvokable]
public IEnumerator<T> GetEnumerator()

  return this.items.GetEnumerator();

但是,如果您深入了解在返回列表的枚举器时实现 ICollection 的列表的实现,您会看到对列表大小的检查

[__DynamicallyInvokable]
[Serializable]
public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator

   ....

  [__DynamicallyInvokable]
  public bool MoveNext()
  
    List<T> list = this.list;
    if (this.version != list._version || (uint) this.index >= (uint) list._size)
      return this.MoveNextRare();
    this.current = list._items[this.index];
    this.index = this.index + 1;
    return true;
  

正如你在这一行看到的

if (this.version != list._version || (uint) this.index >= (uint) list._size)

这意味着当您尝试遍历一个空元素集合时,MoveNext 返回 false,然后 foreach 结束。

所以回到你的 ViewBag,如​​果客户不为空,你不应该收到任何错误或异常,首先编译器在运行时检测到你在 ViewBag 上使用元素集合,如果不是null,然后它遍历它调用 GetEnumerator 在返回 IEnumerator 的集合上并调用 MoveNext 和 Current 以获取列表的每个元素。

【讨论】:

以上是关于这是错误的,为啥不是? ASP.NET MVC 视图包的主要内容,如果未能解决你的问题,请参考以下文章

为啥会收到奇怪的错误消息 asp.net mvc "elmah.mvc logging library"?

为啥 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合?

为啥 ASP.NET MVC3 区域和 Razor 视图会产生此错误?

ASP.NET 5 MVC6 错误:项目不是 Web 项目

为啥在 ASP.NET MVC 中回发后模型为空

为啥 ASP.Net MVC 模型绑定器将空 JSON 数组绑定到 null?