这是错误的,为啥不是? 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 集合?