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

如何在Razor View中正确展示所有待审批的用户列表?

问题核心根源
  • 页面模型中定义的UserId、IsSelected均为单个标量属性,在OnGetAsync中循环遍历_db.UserRoles时,每轮循环都会覆盖前一次赋值的属性值,循环结束后仅保留最后一条匹配记录的内容,没有将多用户数据存储为集合供视图使用。
  • 视图页面硬编码仅渲染单条用户选项块,没有遍历集合的渲染逻辑,甚至标签绑定的是当前登录管理员的身份信息,无法匹配多用户展示需求。
  • 此前尝试编写foreach循环未生效的原因:页面模型中没有可被遍历的集合类型属性,不存在可遍历的数据源。
针对性修正方案

1. 调整页面模型Approve.cshtml.cs

新增承载单条审批项的实体类,将单值属性替换为用户集合属性,在GET请求中一次性组装好所有待审批用户数据:

public class ApproveModel : PageModel
{
    private readonly ApplicationDbContext _db;

    // 定义单条用户审批项的结构
    public class UserApprovalItem
    {
        public string UserId { get; set; }
        public string DisplayName { get; set; }
        public bool IsSelected { get; set; }
    }

    // 替换原有单值属性,存储所有待审批用户列表
    public List<UserApprovalItem> PendingUserList { get; set; } = new();

    public ApproveModel(ApplicationDbContext db)
    {
        _db = db;
    }

    public async Task<IActionResult> OnGetAsync()
    {
        // 联表查询所有绑定待审批角色(RoleId = "2")的用户,组装为列表
        PendingUserList = await _db.UserRoles
            .Where(ur => ur.RoleId == "2")
            .Join(
                _db.Users,
                ur => ur.UserId,
                u => u.Id,
                (ur, u) => new UserApprovalItem
                {
                    UserId = u.Id,
                    DisplayName = u.UserName,
                    IsSelected = true // 可根据业务调整初始勾选状态
                }
            )
            .ToListAsync();

        return Page();
    }

    // 新增POST处理方法,接收前端提交的审批结果
    public async Task<IActionResult> OnPostAsync(List<UserApprovalItem> submittedUsers)
    {
        // 在此处实现审批状态更新逻辑,将提交的用户状态写入数据库
        return Page();
    }
}

2. 调整视图页面Approve.cshtml

将单条用户的渲染块改为遍历集合的循环逻辑,确保每个用户项都生成独立的表单控件,支持模型绑定:

<form method="post">
<div class="card">
    <div class="card-header">
        <h2>Approve users</h2>
    </div>
    <div class="card-body">
        @* 遍历所有待审批用户,逐一生成勾选块 *@
        @foreach (var userItem in Model.PendingUserList)
        {
            <div class="form-check m-1">
                <input type="hidden" asp-for="@userItem.UserId" />
                <input asp-for="@userItem.IsSelected" class="form-check-input" />
                <label class="form-check-label">
                    @userItem.DisplayName
                </label>
            </div>
        }
    </div>
    <div class="card-footer">
        <input type="submit" value="Update" class="btn btn-primary" style="width:auto" />
    </div>
</div>

关键注意事项

  • 视图中渲染表单控件时,必须为每一项携带对应的UserId隐藏域,否则POST提交时后端无法区分勾选状态对应的具体用户。
  • 多数据展示场景禁止使用全局标量属性存储循环遍历的结果,必须使用集合类型属性作为视图数据源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 08:15:05