Pluralsight课程实践中Razor Page无法保存MeetingSpace表单数据问题
问题根因
ASP.NET Core 模型绑定系统默认仅对公共属性进行数据绑定,不会绑定公共字段。你在MeetingSpace类中定义的Name、Location、Capacity都是公共字段,所以表单提交的对应值不会被绑定到对象上,最终得到的就是默认实例。
修复方案
修改MeetingSpace.cs,把三个公共字段改成带get/set的公共属性即可:
public class MeetingSpace : MeetingObjectsBaseClass, IEquatable<MeetingSpace> { //private static int classCount = 3; //TODO: Change to 0 default when database implemented // 将原公共字段修改为公共属性 public string Name { get; set; } public string Location { get; set; } public int Capacity { get; set; } public override void EditDetails() { throw new NotImplementedException(); } public bool Equals(MeetingSpace other) { if (Name == other.Name && Location == other.Location && Capacity == other.Capacity) { return true; } else { return false; } } public override int GenerateNewId() { throw new NotImplementedException(); } public override void GetAll() { throw new NotImplementedException(); } }
可选优化建议
- 表单提交后增加模型有效性校验,避免非法数据写入:
public IActionResult OnPost() { if(!ModelState.IsValid) { return Page(); } MeetingSpace = meetingSpaceData.Update(MeetingSpace); meetingSpaceData.Commit(); // 提交成功后建议跳转到详情页/列表页,避免用户重复提交表单 return RedirectToPage("./Detail", new { meetingSpaceId = MeetingSpace.Id }); }
- 确认
MeetingObjectsBaseClass确实继承自BookingEntityBase,保证Id属性可以正常被绑定。
内容的提问来源于stack exchange,提问作者Nyle Alliss
相关产品推荐
相关产品推荐

