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

ASP.NET MVC:多个单选按钮无法绑定到控制器Action求助

问题分析与解决方案

我仔细看了你的代码,核心问题是单选按钮的AJAX请求无法正确绑定到控制器的QAns模型,同时还有几个潜在的问题(比如多用户冲突、SQL注入风险),下面一步步帮你解决:

1. 先解决模型绑定失败的核心问题

模型绑定是大小写敏感的,你AJAX传递的参数是qid和answer(全小写),所以必须确保你的QAns类属性名完全匹配:

public class QAns
{
    public int qid { get; set; }
    public string answer { get; set; }
}

如果你的属性名是Qid或Answer(首字母大写),模型绑定会直接失败,因为找不到对应参数。

2. 替换静态列表为Session存储答案

你用了static List<QAns> answerList,这是个严重的问题——静态变量是全局共享的,多个用户同时答题时,他们的答案会互相覆盖。换成Session来存储当前用户的答案才是正确的做法:

// 删掉静态列表的定义
// public static List<QAns> answerList = new List<QAns>();

[HttpPost]
public ActionResult Index(QAns ans)
{
    // 从Session获取当前用户的答案列表,不存在则创建新列表
    var answerList = Session["AnswerList"] as List<QAns> ?? new List<QAns>();
    
    // 先移除该问题已有的答案(防止重复提交同一问题的选项)
    var existingAns = answerList.FirstOrDefault(a => a.qid == ans.qid);
    if (existingAns != null)
    {
        answerList.Remove(existingAns);
    }
    answerList.Add(ans);
    
    // 把更新后的列表存回Session
    Session["AnswerList"] = answerList;
    
    return new EmptyResult();
}

3. 修复SQL注入风险并优化评分逻辑

你原来的SQL语句直接拼接参数,存在严重的注入风险,改成参数化查询更安全。另外也可以用Entity Framework替代原生SQL,更简洁:

[HttpPost]
public ActionResult ViewScore()
{
    var answerList = Session["AnswerList"] as List<QAns> ?? new List<QAns>();
    int score = 0;

    // 用EF替代原生SQL,更安全简洁
    using (QuizzDBEntities db = new QuizzDBEntities())
    {
        foreach (QAns ans in answerList)
        {
            bool isCorrect = db.QuestionTables.Any(q => q.qid == ans.qid && q.answer == ans.answer);
            if (isCorrect) score++;
        }
    }

    // 清空当前用户的答案记录
    Session["AnswerList"] = null;
    
    // 注意修正拼写错误:scorre → score
    return Content("Your score is " + score);
}

4. 优化AJAX请求(可选但更稳妥)

你的AJAX代码基本没问题,可以加上错误处理方便调试,同时显式指定contentType:

$('.classname').change(function () {
    var $radio = $(this);
    $.post("", { 
        qid: $radio.attr("name"), 
        answer: $radio.val() 
    }, function (data, status) {
        console.log("已保存问题" + $radio.attr("name") + "的答案");
    })
    .fail(function(xhr, status, error) {
        console.error("保存答案出错:" + error);
    });
});

5. 调试验证小技巧

可以在Index的POST方法里加个调试输出,确认是否接收到数据:

[HttpPost]
public ActionResult Index(QAns ans)
{
    Debug.WriteLine($"收到问题ID:{ans.qid},选中答案:{ans.answer}");
    // 其他代码...
}

同时打开浏览器开发者工具(F12)的Network标签,检查AJAX请求的Form Data是否正确传递了qid和answer参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:17:32