You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:43:10