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
相关产品推荐
相关产品推荐

