.NET MVC Post提交时Suggestion传值到Movie模型所有字段为null
问题原因
提交后字段全为null是表单渲染和模型绑定规则不匹配导致的,核心问题有两个:
- 你在foreach循环里用
HiddenFor绑定循环变量item的属性时,生成的所有隐藏域name属性都是重复的item.xxx格式,不符合ASP.NET MVC默认模型绑定的命名规则,后端无法把表单值解析到Suggestion类型的参数上,拿到的model自然全是空默认值。 - 整个列表被包在同一个表单里,点击任意提交按钮都会把所有行的字段全部提交,本身也无法区分你要操作哪一条建议数据。
修复方法
最适配你当前单条提交场景的方案是给每一行单独做表单,去掉外层包裹整个表格的大表单,修改视图核心代码如下:
<table style="position:absolute; left:35%; top:30%;"> <tr> <th><label>MovieID</label></th> <th><label>MovieAdi</label></th> <th><label>PlatformID</label></th> <th><label>TemaID</label></th> <th><label>TurID</label></th> <th><label>Add it.</label></th> </tr> @foreach (var item in Model) { <tr> <td style="padding:20px;"> @Html.DisplayFor(modelItem => item.Id) </td> <td>@Html.DisplayFor(modelItem => item.MovieAdi)</td> <td>@Html.DisplayFor(modelItem => item.PlatformID)</td> <td>@Html.DisplayFor(modelItem => item.TemaID)</td> <td>@Html.DisplayFor(modelItem => item.TurID)</td> <td> @* 每行独立表单,仅提交当前行数据 *@ @using (Html.BeginForm("SuggestionList", "Panel", FormMethod.Post)) { @Html.Hidden("Id", item.Id) @Html.Hidden("MovieAdi", item.MovieAdi) @Html.Hidden("MovieAciklama", item.MovieAciklama) @Html.Hidden("TurID", item.TurID) @Html.Hidden("TemaID", item.TemaID) @Html.Hidden("PlatformID", item.PlatformID) <button class="btn btn-success">Add the suggestion.</button> } </td> </tr> } </table>
这里直接用Html.Hidden指定字段名和值,核心是保证隐藏域的name属性和Suggestion模型的属性名完全一致,模型绑定器就能正确填充后端的参数对象。
另外你现有Post方法里漏了给MovieAciklama字段赋值,记得补上这行代码,否则数据库里这个字段会一直是空值:
pmovie.MovieAciklama = model.MovieAciklama;
如果后续需要做批量提交功能,就不能用单行表单的方案,需要把视图模型改成
List<Suggestion>类型,用for循环渲染带索引标记的字段名,后端接收List<Suggestion>类型的参数处理即可,你当前单条提交的场景用上面的方案就足够。
内容的提问来源于stack exchange,提问作者Heidelbergensis
相关产品推荐
相关产品推荐

