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

ASP.NET中如何按职位分组展示候选人,避免职位重复?

ASP.NET按职位分组展示投票候选人的解决方案

要实现每个职位仅显示一次、下方列出对应候选人的分组效果,核心是先对数据按职位分组,再用嵌套Repeater控件分层绑定,具体步骤如下:

1. 后台数据分组处理

首先从数据库关联投票职位表与候选人表,获取完整数据后,通过LINQ按Post字段分组,将数据整理为「职位+对应候选人列表」的结构化集合:

// 假设已从数据库查询得到候选人与职位关联的数据集(示例用Entity Framework)
var candidateList = dbContext.Candidates
                            .Join(dbContext.Posts, 
                                  c => c.PostId, 
                                  p => p.Id, 
                                  (c, p) => new 
                                  {
                                      Post = p.PostName, // 职位名称
                                      c.Name,
                                      c.Part,
                                      c.Program,
                                      c.Picture,
                                      c.CandidateId // 候选人ID,用于投票控件标识
                                  })
                            .ToList();

// 按职位分组
var groupedData = candidateList.GroupBy(c => c.Post)
                               .Select(g => new 
                               {
                                   PostName = g.Key,
                                   Candidates = g.ToList()
                               })
                               .ToList();

// 绑定到外层Repeater
rptPosts.DataSource = groupedData;
rptPosts.DataBind();

2. 前台嵌套Repeater布局

外层Repeater负责渲染职位标题,内层Repeater绑定当前职位下的所有候选人,同时修正投票控件的name属性(按职位分组,确保同一职位内单选互斥):

<asp:Repeater ID="rptPosts" runat="server">
    <ItemTemplate>
        <!-- 职位标题,仅显示一次 -->
        <div class="row fs-5 py-2 border-bottom text-uppercase">
            <asp:Label ID="lblPost" runat="server" Text='<%# Eval("PostName") %>' />
        </div>

        <!-- 内层Repeater绑定当前职位的候选人 -->
        <asp:Repeater ID="rptCandidates" runat="server" DataSource='<%# Eval("Candidates") %>'>
            <ItemTemplate>
                <div class="row py-2">
                    <div class="card-body bg-light">
                        <p class="px-2">
                            <asp:Image runat="server" ImageUrl='<%# Eval("Picture") %>' Height="300px" alt="候选人照片" />
                        </p>
                        <p class="px-2 text-uppercase text-success fw-bold">
                            FULL NAME : <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>' />
                        </p>
                        <p class="px-2 text-uppercase text-success fw-bold">
                            Part Name : <asp:Label ID="lblPart" runat="server" Text='<%# Eval("Part") %>' />
                        </p>
                        <p class="px-2 text-uppercase text-success fw-bold">
                            Program : <asp:Label ID="lblProgram" runat="server" Text='<%# Eval("Program") %>' />
                        </p>

                        <!-- 单选按钮:name按职位分组,确保同一职位内只能选一个 -->
                        <div class="form-check">
                            <input class="form-check-input" type="radio" 
                                   name='voteRadio_<%# Eval("PostName") %>' 
                                   id='radio_<%# Eval("CandidateId") %>'
                                   value='<%# Eval("CandidateId") %>'>
                            <label class="form-check-label" for='radio_<%# Eval("CandidateId") %>'>
                                Vote
                            </label>
                        </div>

                        <!-- 复选框:可根据需求调整name属性 -->
                        <div class="form-check">
                            <input class="form-check-input" type="checkbox" 
                                   value='<%# Eval("CandidateId") %>' 
                                   id='check_<%# Eval("CandidateId") %>'>
                            <label class="form-check-label" for='check_<%# Eval("CandidateId") %>'>
                                Vote Yes
                            </label>
                        </div>
                    </div>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

关键注意事项

  • 数据分组逻辑:确保分组后的集合包含明确的职位名称和对应的候选人列表,避免重复数据。
  • 投票控件标识:单选按钮的name属性需按职位区分(如示例中的voteRadio_<%# Eval("PostName") %>),否则整个页面的单选按钮会互斥,不符合投票逻辑。
  • 数据绑定正确性:内层Repeater的DataSource需绑定到外层Repeater当前项的Candidates属性,确保数据关联正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:24:59