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

ASP.NET Razor Pages表单提交OnPost()时属性值为Null的问题

问题分析与解决方案

核心原因

表单中手动指定的name属性与Razor Pages模型绑定要求的名称不匹配,导致提交的数据无法正确映射到AppointmentModel:

  • asp-for="AppointmentModel.PatientName" 会自动生成标准绑定名称name="AppointmentModel.PatientName",但你手动指定了name="patientName",名称不一致直接导致绑定失败。
  • 部分字段的name大小写不统一(如Description),虽然后端绑定默认大小写不敏感,但手动覆盖name会破坏自动绑定逻辑。

重建数据库后前两次正常属于临时状态巧合,并非根本解决方法。

修复步骤

1. 移除表单中所有手动添加的name属性

让asp-for标签助手自动生成符合模型绑定规则的name值,修改后的表单代码如下:

<form method="post">
    <input type="text" asp-for="AppointmentModel.PatientName" placeholder="Name"/>
    <input asp-for="AppointmentModel.Start" asp-format="{0:yyyy-MM-ddTHH:mm}" placeholder="Start" />
    <input asp-for="AppointmentModel.End" asp-format="{0:yyyy-MM-ddTHH:mm}" placeholder="End" />
    <input type="text" asp-for="AppointmentModel.Description" placeholder="Description" />
    <select asp-for="AppointmentModel.DoctorId">
        @foreach(var item in Model.Doctors) {
            <option value="@item.Id">@item.Email</option>
        }
    </select>
    <button type="submit">Submit</button>
</form>

2. 增强OnPost方法的空值与验证检查

避免AppointmentModel为空时触发空引用异常,同时拦截无效提交:

public IActionResult OnPost() {
    if (!ModelState.IsValid || AppointmentModel == null) {
        // 重新加载页面所需数据,返回当前页显示错误
        Appointments = Db.Appointments.ToList();
        Doctors = Db.Users.Where(f => f.Role == "Doctor").ToList();
        return Page();
    }

    var userId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier));
    AppointmentModel.PatientId = userId;
    Db.Appointments.Add(AppointmentModel);
    Db.SaveChanges();
    return RedirectToPage("Index");
}

3. 确认Appointment实体类定义

确保实体类属性名称、数据类型与表单字段完全匹配,示例如下:

public class Appointment {
    public int Id { get; set; }
    public string PatientName { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public string Description { get; set; }
    public int DoctorId { get; set; }
    public int PatientId { get; set; }
    public string Status { get; set; } // 若此字段必填,需在表单中添加对应输入项或设置默认值
}

额外建议

  • 为实体类属性添加数据验证特性(如[Required]、[DataType(DataType.DateTime)]),配合ModelState.IsValid提前拦截无效提交。
  • 不要手动修改asp-for生成的name、id等属性,标签助手会自动处理模型绑定的命名规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:45:27