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集合的索引不能一一对应,绑定的对象也会错位。
修复方案
- 先清理前端表单的错误代码,去掉单选框的手动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的格式即可。
- 后端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
相关产品推荐
相关产品推荐

