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

ASP.NET Core Razor Pages BindProperty集合List绑定失效问题

解决方案:修复Razor页面Post时集合为空的问题

问题原因

  1. 使用foreach循环渲染集合,无法生成模型绑定所需的带索引字段名称,ASP.NET Core无法识别并绑定集合数据。
  2. 复选框未通过asp-for正确绑定,无法回传IsChecked状态。
  3. 未保留集合中需要回传的非编辑字段(如ClassDate、ClassDateS等),这些字段是后端处理必需的,但页面未提交。
  4. OnGet方法中未将创建的PermDateCourseViewModel实例添加到PermDates列表,导致页面初始无数据。

修改步骤

1. 修正PageModel的OnGet方法

确保视图模型实例被添加到集合中:

public void OnGet(int Id)
{
    DateTime StartPeriod = DateTime.Now;
    PermDates = new List<PermDateCourseViewModel>();

    PermDateCourseViewModel permDate = new PermDateCourseViewModel()
    {
        ClassDate = StartPeriod,
        ClassDateS = StartPeriod.ToString().ToShamsi(),
        Weekday = PersianShamsi.ReturnWeekDayname(StartPeriod.ToString().ToShamsi()),
        ClassTime = "08:00",
        IsChecked = true,
    };
    // 添加实例到集合,否则页面无数据
    PermDates.Add(permDate);
}

2. 重构Razor页面的表单渲染

将foreach替换为for循环,生成正确的模型绑定字段名,并添加隐藏字段保留必要数据:

@page
@model KabirLang.Pages.CourseSessionsSetModel

<div class="col-md-12">
    <form method="post">
        <!-- 隐藏字段传递CurCourseId,确保Post方法能接收 -->
        <input type="hidden" asp-for="CurCourseId" />
        <div class="row">
            <div class="col-lg-6">
                <div class="portlet box bg-light m-5">
                    <div class="portlet-body">
                        <table class="table compact">
                            <thead>
                                <tr>
                                    <td>انتخاب</td>
                                    <td>روز</td>
                                    <td>تاریخ</td>
                                    <td>ساعت</td>
                                </tr>
                            </thead>
                            <tbody>
                                <!-- 使用for循环生成带索引的字段名,支持模型绑定 -->
                                @for (int i = 0; i < Model.PermDates.Count; i++)
                                {
                                    <tr>
                                        <td>
                                            <!-- 正确绑定IsChecked属性 -->
                                            <input type="checkbox" asp-for="@Model.PermDates[i].IsChecked" />
                                        </td>
                                        <td>@Model.PermDates[i].Weekday</td>
                                        <td>@Model.PermDates[i].ClassDateS</td>
                                        <td>
                                            <input class="form-control clockpicker-autoclose" asp-for="@Model.PermDates[i].ClassTime" />
                                        </td>
                                        <!-- 添加隐藏字段,回传必要的非编辑字段 -->
                                        <input type="hidden" asp-for="@Model.PermDates[i].ClassDate" />
                                        <input type="hidden" asp-for="@Model.PermDates[i].ClassDateS" />
                                        <input type="hidden" asp-for="@Model.PermDates[i].Weekday" />
                                    </tr>
                                }
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>

            <div class="col-lg-2">
                <div class="m-5">
                    <button type="submit" asp-page-handler="AddSession" class="btn btn-info btn-block btn-success m-5">
                        <i class="fas fa-chevron-left"></i>
                    </button>

                    <button type="submit" asp-page-handler="DelSession" class="btn btn-info btn-block btn-danger m-5">
                        <i class="icon-close"></i>
                    </button>
                </div>
            </div>
        </div>
    </form>
</div>

3. 补充PageModel的CurCourseId绑定

在PageModel中添加CurCourseId的绑定属性,确保Post方法能接收该参数:

public class CourseSessionsSetModel : PageModel
{
    [BindProperty]
    public List<PermDateCourseViewModel> PermDates { get; set; }

    // 添加BindProperty属性,绑定CurCourseId
    [BindProperty]
    public int CurCourseId { get; set; }

    [TempData]
    public string ShowMessage { get; set; }

    private readonly DbkabirContext db;
    public CourseSessionsSetModel(DbkabirContext context)
    {
        db = context;
    }

    // 其他方法保持不变
}

关键说明

  • for循环的作用:ASP.NET Core模型绑定要求集合字段名称格式为[索引].属性名(如PermDates[0].IsChecked),foreach无法生成这种格式,for循环通过索引可实现正确命名。
  • 隐藏字段的作用:页面上显示的ClassDate、ClassDateS等字段如果不通过隐藏字段提交,后端Post时无法获取这些数据,导致集合项的必要信息缺失。
  • BindProperty属性:确保类中的属性能被模型绑定机制识别,支持Get/Post请求的数据传递。

内容的提问来源于stack exchange,提问作者Ashkan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:13:15