ASP.NET Core MVC提交表单后无法获取模型值求助
表单集合模型绑定为null的解决方法
问题场景
尝试创建包含过滤器集合的表单,通过文本框获取用户输入,提交后控制器的IEnumerable<FilterCondition>参数始终为null,但使用IFormCollection能正常读取各文本框的值。
当前代码
视图(cshtml)
<table> @{ for (int i = 0; i < 3; i++) { <tr> <td> @Html.TextBox(i+".Code") </td> <td> @Html.Hidden(i+".FieldName") </td> <td> @Html.TextBox(i+".FieldValue") </td> <td> @Html.TextBox(i+".Operator") </td> </tr> } <tr> <td> <input type="submit" value="Create" /> </td> </tr> } </table>
模型类
public class FilterCondition { public string? Code { get; set; } public string? FieldName { get; set; } public string? FieldValue { get; set; } public string? Operator { get; set; } }
控制器代码
[HttpPost] public ActionResult Submitter(IEnumerable<FilterCondition> formVals) { try { return RedirectToAction(nameof(Index)); } catch { return View(); } }
问题原因
ASP.NET MVC的模型绑定机制需要表单字段名称与控制器参数的集合结构匹配。当前表单字段名称为0.Code、1.FieldName等,未关联到控制器参数formVals,导致模型绑定无法识别这些字段属于formVals集合的元素,因此参数值为null。
解决方法
修改视图中的输入框名称,为每个字段添加控制器参数名作为前缀,并采用数组索引格式:参数名[索引].属性名,让模型绑定能正确识别集合元素。
修改后的视图代码
<table> @{ for (int i = 0; i < 3; i++) { <tr> <td> @Html.TextBox($"formVals[{i}].Code") </td> <td> @Html.Hidden($"formVals[{i}].FieldName") </td> <td> @Html.TextBox($"formVals[{i}].FieldValue") </td> <td> @Html.TextBox($"formVals[{i}].Operator") </td> </tr> } <tr> <td> <input type="submit" value="Create" /> </td> </tr> } </table>
可选方案:使用包装模型类
如果更倾向于用包装类,可创建包含集合的模型:
public class FilterModel { public IEnumerable<FilterCondition> FilterConditions { get; set; } = new List<FilterCondition>(); }
然后修改控制器参数:
[HttpPost] public ActionResult Submitter(FilterModel model) { // 访问model.FilterConditions获取数据 try { return RedirectToAction(nameof(Index)); } catch { return View(); } }
对应的视图字段名称改为FilterConditions[{i}].Code、FilterConditions[{i}].FieldName等即可。
内容的提问来源于stack exchange,提问作者srinivasa rao
相关产品推荐
相关产品推荐

