MVC控制器传数据至ViewModel后视图遍历报错,求排查方案
问题排查与修复方案
嘿,我一眼就看出问题出在哪了——你在视图里直接对Model(也就是UsersViewModel实例)用了foreach,但这个ViewModel本身不是可枚举的集合,它只是一个包裹了用户列表的容器类而已!
错误根源
你的UsersViewModel里确实定义了_Users属性来存储用户列表,但视图里的遍历代码写错了对象:
@foreach (var item in Model) // 这里错了!Model是单个ViewModel对象,不是集合
C#要求遍历的对象必须实现IEnumerable接口(或者有对应的GetEnumerator方法),而UsersViewModel只是一个普通类,自然不满足这个要求,所以抛出了那个错误。
快速修复
只需要把遍历对象改成ViewModel里的_Users集合就行,修改后的视图代码:
@model ProactiveDisclosure.Models.UsersViewModel @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table class="table"> <tr> <th>用户名</th> <th>姓名</th> <!-- 可以根据需求添加更多表头 --> </tr> @foreach (var item in Model._Users) // 这里改成遍历_Users集合 { <tr> <td>@item.USERNAME</td> <td>@item.SURNAME @item.GIVENNAME</td> </tr> } </table>
后续排查思路(帮你避开同类坑)
- 先确认视图绑定的Model类型:视图开头的
@model声明决定了Model变量的类型,这里是单个UsersViewModel对象,不是集合 - 检查ViewModel的结构:明确你要展示的集合属性名称(比如这里的
_Users),确保拼写、大小写完全匹配 - 如果想让ViewModel本身可遍历,可以让它实现
IEnumerable<Business.User>接口,但更推荐当前的包裹式设计——因为ViewModel通常会扩展其他属性(比如筛选条件、分页参数等),保持结构清晰更利于维护
另外看你的业务层、控制器代码都是没问题的,就是视图里遍历对象选错了,改完就能正常渲染用户列表啦!
内容的提问来源于stack exchange,提问作者Tim Cadieux
相关产品推荐
相关产品推荐

