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

Razor Pages表单提交后OnPost接收selections参数始终为null如何解决

问题根因

你遇到的问题和SQL Server完全无关,是ASP.NET Core Razor Pages的模型绑定逻辑写错了,导致后端拿不到前端提交的正确值,默认返回了数值类型的默认值0。
主要错误有3个:

  • 你手动给单选框加了name="@Que.ID",覆盖了asp-for自动生成的符合绑定规则的name属性。模型绑定要匹配IList<Selection>参数,要求表单字段的name必须是selections[0].Answer、selections[1].Answer这种格式,你改成问题ID后,后端找不到对应字段,自然会给数值类型赋默认值0。
  • 你加的隐藏input和submit按钮上的asp-route-selections完全无效。复杂集合类型不能直接这么序列化放到路由或者input value里,直接写@selections输出的只是集合的ToString结果,也就是类名,根本传不了实际数据。
  • 循环逻辑有问题:你遍历Model.Answers的索引来绑定selections[i],如果答案和Selection集合的索引不能一一对应,绑定的对象也会错位。

修复方案

  1. 先清理前端表单的错误代码,去掉单选框的手动name属性、无用的隐藏input、submit上的asp-route属性,修复后参考代码如下:
<form method="POST">
    @for (int q = 0; q < Model.Questions.Count; q++)
    {
        var Que = Model.Questions[q];
        <b>@Que.Text</b>
        <br />
        @foreach (var ans in Model.Answers.Where(a=>a.QuestionID == Que.ID))
        {
            <div style="border: 1px solid black;">
                <label>@ans.Text</label>
                <input type="radio" value="@ans.ID" asp-for="@Model.Selections.First(s=>s.QuestionID == Que.ID).Answer" />
            </div>
        }
        <br/><br/><br/><br/>
    }
    <br />
    <input type="submit" />
</form>

如果你的Selection类没有QuestionID字段,也可以调整循环索引保证每个Selection和问题一一对应,只要保证asp-for生成的name符合selections[索引].Answer的格式即可。

  1. 后端OnPost的冗余代码可以删掉,加断点就能看到提交过来的selections已经有正确值了:
public IActionResult OnPost(IList<Selection> selections)
{
    byte j = 0;
    for (byte i = 0; i < selections.Count; i++)
    {
        if (selections[i].Answer != 80)
        {
            Selected[j] = selections[i].Answer;
            j++;
        }
    }
    return Page();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:09:04