Razor页面表单下拉框如何绑定返回meetingSpace对象到Booking属性
Razor页面Select下拉框模型绑定失败修复方案
问题根源
当前代码存在3个核心错误导致绑定失效:
- 表单提交只能传递字符串类型的值,无法直接绑定完整的
meetingSpace复杂对象,必须通过唯一标识(如Id)间接关联 - 手动填写的
select标签name属性不符合ASP.NET Core模型绑定的层级匹配规则,无法映射到Booking下的对应属性 option的value属性写死为固定字符串meetingSpace,没有读取实际的Id值,提交的内容完全无效
修复方案
推荐优先绑定外键字段Booking.MeetingSpaceId,这是ASP.NET Core MVC/Razor Pages的标准绑定实践,修改最后一个form-group的代码如下:
<div class="form-group"> <label asp-for="Booking.MeetingSpaceId">Room</label> <!-- asp-for标签助手会自动生成符合绑定规则的id和name属性 --> <select asp-for="Booking.MeetingSpaceId" class="form-control" data-val="true" data-val-required="The meeting space field is required"> @foreach (var meetingSpace in Model.meetingSpaces) { <!-- value绑定会议空间的唯一Id --> <option value="@meetingSpace.Id">@meetingSpace.Name</option> } </select> <span class="text-danger" asp-validation-for="Booking.MeetingSpaceId"></span> </div>
如果你的Booking实体没有单独的MeetingSpaceId外键字段,只有MeetingSpace导航属性,只需要把上面asp-for的属性值改为Booking.MeetingSpace.Id即可,提交后Booking.MeetingSpace.Id会被正确赋值,你可以在后端拿着这个Id查询完整的MeetingSpace对象补充到Booking属性中。
内容的提问来源于stack exchange,提问作者Nyle Alliss
相关产品推荐
相关产品推荐

