Razor Page复杂模型绑定提交后DayRange的Selected属性不更新问题
1. 修复模型类构造函数
ASP.NET Core 模型绑定系统在实例化需要绑定的复杂类型时,要求类型存在公共无参构造函数,你当前的DaySelected类只定义了带参数的构造函数,绑定过程无法正常创建实例,导致属性值无法更新。
修改后的DaySelected代码:
public class DaySelected { public bool Selected { get; set; } public string DayName { get; set; } // 新增无参构造函数供模型绑定使用 public DaySelected(){} public DaySelected(string day) { Selected = false; DayName = day; } }
同时确认DayRange类中的Days是公共可读写的属性,示例:
public class DayRange { // 必须是公共属性,不能是字段,也不能有私有setter public List<DaySelected> Days { get; set; } // 其他属性... }
2. 修复Razor页面的循环逻辑
你当前使用foreach遍历集合生成表单字段,最终生成的input的name属性为Day.Selected,不符合集合绑定的命名规则。ASP.NET Core 绑定集合类型时,要求字段名格式为集合属性名[索引].属性名,比如Days[0].Selected、Days[1].Selected,才能正确映射到集合的对应元素。
把foreach改为for循环按索引访问即可,同时需要加DayName的隐藏字段,避免提交后DayName属性丢失:
@* 注意声明模型类型是小写的@model,不是@Model *@ @model DayRange ... <form asp-action="RegisterSelection" asp-controller="DayRegister"> <table> @for (int i = 0; i < Model.Days.Count; i++) { <tr> <td> <input type="hidden" asp-for="@Model.Days[i].DayName" /> <input asp-for="@Model.Days[i].Selected" /> <label asp-for="@Model.Days[i].Selected">@Model.Days[i].DayName</label> </td> </tr> } </table> <button type="submit">Confirm</button> </form>
3. 问题排查验证方法
如果修改后仍有问题,按以下步骤定位:
- 打开浏览器开发者工具的「网络」选项卡,提交表单后查看请求的Form Data,确认提交的键名是否符合
Days[索引].Selected格式,值是否和选中状态一致 - 在后端Action中打断点,查看
ModelState.IsValid的值,如果为false,遍历ModelState.Values查看具体的绑定错误信息
内容的提问来源于stack exchange,提问作者Kiiiieeeeuuuw
相关产品推荐
相关产品推荐

