ASP.NET Core获取表格同组SelectListItem每行选中值及行标识
ASP.NET Core 表格行下拉框值与行标识关联提交方案
问题根因
- 现有代码的
<select>标签未设置name属性,表单提交时不会携带该控件的选中值 - 未按照ASP.NET Core模型绑定规则命名字段,导致后端无法建立选中值和对应行
Question_ID的映射关系
具体实现
1. 视图层改造
核心规则:利用ASP.NET Core 对字典类型的默认模型绑定规则,将下拉框的name属性设置为[后端参数名][Question_ID]格式,提交后框架会自动组装为键值对结构。
整个表格需要包裹在form标签内指定提交地址和提交方式,修正后的代码如下:
<form method="post" asp-action="SubmitQuestionRate"> <table class="table"> <!-- 原有表头逻辑保持不变 --> <thead> <tr> <th>问题标题</th> <th>答案</th> <th>问题类型</th> <th>可信度评级</th> </tr> </thead> <tbody> @foreach (var item in allQuestion) { <tr> <td>@item.Question_Title</td> <td>@item.Answere1</td> <td>@item.Question_type</td> <td> <!-- 核心:新增name属性,以Question_ID作为字典键 --> <select id="trueRate[@item.Question_ID]" name="trueRate[@item.Question_ID]" class="form-control"> @foreach (var rate in TrueRate) { <option value="@rate.Value">@rate.Text</option> } </select> </td> </tr> } </tbody> </table> <button type="submit" class="btn btn-primary mt-3">提交评级</button> </form>
2. 后端接收逻辑
直接使用字典类型作为Action参数即可,框架会自动完成绑定,字典的Key为行唯一标识Question_ID,Value为该行下拉框的选中值:
[HttpPost] public IActionResult SubmitQuestionRate(Dictionary<int, int> trueRate) { // 遍历字典即可拿到所有行的提交数据 foreach (var (questionId, selectedRate) in trueRate) { // 执行业务逻辑,比如将questionId对应的评级selectedRate存入数据库 } return View(); }
适配说明
- 如果
Question_ID是字符串/Guid类型,将字典Key类型替换为对应类型即可 - 如果评级值是字符串格式,将字典Value类型替换为
string - 如果需要提交更多行字段(比如问题标题、备注等),可以定义专用Dto类,用集合索引的命名规则绑定,字典方案适合当前仅需要提交ID和选中值的轻量场景
注意:不要随意修改
name属性的格式,ASP.NET Core默认模型绑定对字典类型的识别规则就是[参数名][键值],格式错误会导致绑定为空。
内容的提问来源于stack exchange,提问作者emad.b
相关产品推荐
相关产品推荐

