You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 08:27:03