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

Razor页面出现CS1579错误:foreach无法遍历WorkingVote类型

Razor页面中CS1579错误:foreach无法遍历WorkingVote类型

错误详情

级别 代码 描述 项目 文件 行 抑制状态
活动错误 CS1579 foreach语句无法操作类型为'WorkingVote'的变量,因为'WorkingVote'不包含'GetEnumerator'的公共实例或扩展定义 VoteTracker S:\VisualStudioProjects\VoteTracker\Pages\WorkingVotes\Edit.cshtml

错误位置

错误出现在Edit.cshtml的表格tbody代码段:

<tbody>
    @foreach (var obj in Model.WorkingVote)
    {...

其中Model.WorkingVote被下划线标记。

问题背景

已查阅相关资料,明白需要GetEnumerator和集合类型,但尝试将public WorkingVote? WorkingVote改为IEnumerable或List后引发更多错误。

后端代码(EditModel.cs)

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;

namespace VoteTracker.Pages.WorkingVotes;

[BindProperties]
public class EditModel : PageModel
{
    private readonly ApplicationDbContext _db;
    public EditModel(ApplicationDbContext db)
    {
        _db = db;
    }

    public WorkingVote? WorkingVote { get; set; } 

    public IEnumerable<Committee> DisplayCommitteeData { get; set; }
    public IEnumerable<VoteType> DisplayVoteTypeData { get; set; }
    public IEnumerable<Supervisor> DisplaySupervisorData { get; set; }
    public IEnumerable<Status> DisplayStatusData { get; set; }

    public async Task OnGetAsync(int Id)
    {
        WorkingVote = _db.WorkingVote.Find(Id);
        DisplayCommitteeData = await _db.Committee.ToListAsync();
        DisplayVoteTypeData = await _db.VoteType.ToListAsync();
        DisplaySupervisorData = await _db.Supervisor.ToListAsync();
        DisplayStatusData = await _db.Status.ToListAsync();
    }

    public async Task<IActionResult> OnPost()
    {
        if (ModelState.IsValid)
        {
            _db.WorkingVote.Update(WorkingVote);
            await _db.SaveChangesAsync();
            TempData["success"] = "Vote cast successfully.";
            return RedirectToPage("Index");
        }
        return Page();
    }
}

解决方案

核心问题分析

Model.WorkingVote是单个实体对象(WorkingVote?类型),而foreach只能遍历集合类型(比如IEnumerable<T>、List<T>等)。Edit页面的逻辑是编辑单条投票记录,根本不需要用foreach遍历它。

修复步骤

  1. 修改Razor页面代码:
    去掉foreach循环,直接使用Model.WorkingVote的属性值,注意添加空值判断避免空引用异常。示例修复后的tbody代码:

    <tbody>
        <tr>
            <td>@Model.WorkingVote?.VoteId</td>
            <td>@Model.WorkingVote?.CommitteeId</td>
            <!-- 其他属性依此类推 -->
        </tr>
    </tbody>
    
  2. 保留后端代码不变:
    后端的WorkingVote属性就是单个实体,不需要改成集合类型——Edit页面本来就是处理单条记录的,改成集合会和OnGetAsync里用Find(Id)获取单条记录的逻辑冲突,这也是你之前改集合类型引发更多错误的原因。

额外提示

如果需要在Edit页面展示多条关联投票记录,可在EditModel中新增集合属性:

public IEnumerable<WorkingVote> RelatedVotes { get; set; }

然后在OnGetAsync中查询关联数据赋值,再在Razor页面遍历Model.RelatedVotes即可。

内容的提问来源于stack exchange,提问作者MelB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:33:26