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

咨询基于C# MVC实现问卷多题型的高效优化方案

优化问卷数据提交的方案

1. 强类型模型绑定替代FormCollection

直接定义匹配问卷结构的模型类,利用ASP.NET MVC的自动模型绑定能力,彻底避免手动遍历FormCollection的低效操作。

先定义核心模型:

// 问题选项模型
public class QuestionOption
{
    public int OptionId { get; set; }
    public bool IsSelected { get; set; } // 单选/复选场景使用
    public string InputText { get; set; } // 文本框场景使用
}

// 问卷问题模型
public class SurveyQuestion
{
    public int QuestionId { get; set; }
    public int QuestionType { get; set; } // 1=单选, 2=复选, 3=文本
    public List<QuestionOption> Options { get; set; }
}

// 提交的问卷整体模型
public class SurveySubmission
{
    public int SurveyId { get; set; }
    public List<SurveyQuestion> Questions { get; set; }
}

视图中按模型索引生成控件,确保name属性符合模型绑定规则:

@model SurveySubmission

@for (int qIndex = 0; qIndex < Model.Questions.Count; qIndex++)
{
    var question = Model.Questions[qIndex];
    <div class="question-block">
        <p>@question.QuestionText</p>
        @if (question.QuestionType == 1)
        {
            // 单选按钮
            foreach (var opt in question.Options)
            {
                <label>
                    <input type="radio" name="Questions[@qIndex].Options[@opt.OptionId].IsSelected" value="true" />
                    @opt.OptionText
                </label>
            }
        }
        else if (question.QuestionType == 2)
        {
            // 复选框
            foreach (var opt in question.Options)
            {
                <label>
                    <input type="checkbox" name="Questions[@qIndex].Options[@opt.OptionId].IsSelected" value="true" />
                    @opt.OptionText
                </label>
            }
        }
        else if (question.QuestionType == 3)
        {
            // 文本框
            <input type="text" name="Questions[@qIndex].Options[0].InputText" />
        }
        <input type="hidden" name="Questions[@qIndex].QuestionId" value="@question.QuestionId" />
    </div>
}

Controller直接接收强类型模型,无需手动解析:

[HttpPost]
public ActionResult Submit(SurveySubmission submission)
{
    foreach (var question in submission.Questions)
    {
        switch (question.QuestionType)
        {
            case 1:
                var selectedSingle = question.Options.FirstOrDefault(o => o.IsSelected);
                // 保存单选结果
                break;
            case 2:
                var selectedMulti = question.Options.Where(o => o.IsSelected).ToList();
                // 保存复选结果
                break;
            case 3:
                var textContent = question.Options.FirstOrDefault()?.InputText;
                // 保存文本结果
                break;
        }
    }
    return RedirectToAction("Complete");
}

2. 分批AJAX异步提交

如果问卷问题数量极大,可将问卷拆分为多个模块,用户完成一个模块就异步提交一组数据,避免一次性提交海量数据的性能瓶颈:

// 提交单组问题的AJAX函数
function submitQuestionGroup(groupId) {
    const groupData = {
        SurveyId: $("#surveyId").val(),
        GroupId: groupId,
        Questions: getGroupQuestionsData(groupId)
    };

    $.ajax({
        url: "/Survey/SubmitGroup",
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify(groupData),
        success: () => {
            // 切换到下一个模块
            $(`#group-${groupId}`).hide();
            $(`#group-${groupId + 1}`).show();
        }
    });
}

// 提取当前组的问题数据
function getGroupQuestionsData(groupId) {
    const questions = [];
    $(`#group-${groupId} .question-block`).each((_, el) => {
        const questionId = $(el).find("[name*='QuestionId']").val();
        // 根据题型提取对应值,组装成Question结构
        questions.push({ QuestionId: questionId, /* 其他数据 */ });
    });
    return questions;
}

Controller对应处理方法:

[HttpPost]
public JsonResult SubmitGroup(SurveyGroupSubmission groupSubmission)
{
    // 批量保存当前组的问卷数据
    _dbContext.SurveyAnswers.AddRange(ConvertToAnswers(groupSubmission));
    _dbContext.SaveChanges();
    return Json(new { Success = true });
}

3. 数据库层批量操作优化

不管采用哪种提交方式,最终保存数据时要避免循环执行单条SQL语句。比如用Entity Framework的AddRange/UpdateRange批量操作,或者直接编写批量插入SQL脚本,减少数据库交互次数,大幅提升整体效率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:10:17