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

Bootstrap 4.3分页绑定问题:如何实现问卷单题分页导航

实现Bootstrap问卷单页切换功能

嗨,别担心!作为Bootstrap和MVC新手遇到这种问题太正常了,我来帮你一步步实现问卷的单页切换功能~

第一步:调整视图结构

首先咱们要修改现有视图,把每个问卷问题单独标记,添加分页按钮,并且默认只显示第一个问题:

@model cq.Models.EmptySurveyViewModel
<div class="container">
    @using (Html.BeginForm("New", "Client", FormMethod.Post, new { role = "form" }))
    {
        @Html.HiddenFor(m => m.Sequence, Model.Sequence)
        @Html.AntiForgeryToken()
        <h2>@Model.Name</h2>
        <hr />
        @Html.ValidationSummary(false, "", new { @class = "text-danger" })
        @Html.HiddenFor(m => m.Name, new { @value = Model.Name })

        <!-- 问卷问题容器 -->
        <ul id="survey-questions-list">
            @for (int i = 0; i < Model.Questions.Count(); i++)
            {
                <li class="survey-question @(i == 0 ? "d-block" : "d-none")">
                    <!-- 你的问题字段和逻辑,比如: -->
                    <h5>@Model.Questions[i].Text</h5>
                    <!-- 这里放你的输入框、单选框等表单元素 -->
                    @Html.TextBoxFor(m => m.Questions[i].Answer, new { @class = "form-control" })
                </li>
            }
        </ul>

        <!-- Bootstrap分页按钮组 -->
        <div class="mt-4">
            <button type="button" id="prev-btn" class="btn btn-secondary" disabled>上一页</button>
            <span id="page-info" class="mx-3">第 1 页 / @Model.Questions.Count() 页</span>
            <button type="button" id="next-btn" class="btn btn-primary">下一页</button>
        </div>

        <button type="submit" class="btn btn-success mt-3">
            <i class="fas fa-check"></i> 结束 survey
        </button>
    }
</div>

这里的关键改动:

  • 给每个问题li添加了survey-question类,用Bootstrap的d-block(显示)和d-none(隐藏)类控制初始显示状态,只显示第一个问题。
  • 添加了分页按钮组,包括上一页、页码信息、下一页按钮,初始时上一页按钮是禁用状态。

第二步:添加JavaScript切换逻辑

接下来咱们用JavaScript来处理页面切换的交互,把这段代码放在视图的末尾(或者单独的JS文件里):

<script>
    document.addEventListener('DOMContentLoaded', function() {
        const questions = document.querySelectorAll('.survey-question');
        const prevBtn = document.getElementById('prev-btn');
        const nextBtn = document.getElementById('next-btn');
        const pageInfo = document.getElementById('page-info');
        let currentPage = 0; // 从0开始计数,对应第一个问题

        // 更新分页状态的函数
        function updatePagination() {
            // 隐藏所有问题
            questions.forEach(q => q.classList.add('d-none'));
            // 显示当前页的问题
            questions[currentPage].classList.remove('d-none');
            
            // 更新页码信息
            pageInfo.textContent = `第 ${currentPage + 1} 页 / ${questions.length} 页`;
            
            // 控制按钮禁用状态
            prevBtn.disabled = currentPage === 0;
            nextBtn.disabled = currentPage === questions.length - 1;
        }

        // 上一页点击事件
        prevBtn.addEventListener('click', function() {
            if (currentPage > 0) {
                currentPage--;
                updatePagination();
            }
        });

        // 下一页点击事件
        nextBtn.addEventListener('click', function() {
            if (currentPage < questions.length - 1) {
                currentPage++;
                updatePagination();
            }
        });

        // 初始化分页状态
        updatePagination();
    });
</script>

第三步:表单提交说明

不用担心隐藏的问题字段提交不了!因为所有表单元素都在<form>标签内部,即使被d-none隐藏,提交表单时MVC的模型绑定依然能正确获取所有问题的答案,不需要额外处理~

这样你就能实现每个问题单独显示,通过上一页/下一页按钮切换的功能啦!如果还有细节需要调整(比如样式、问题的表单元素),可以根据你的实际需求修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:41:58