Razor Pages下拉列表提交时存储显示值而非主键Key的方法
问题根源
SelectList构造函数的第二个参数是用来指定下拉选项<option>标签value属性绑定的实体字段,你当前代码传的是"ID",所以渲染出的所有选项value都是分类表主键,表单提交时默认会把选中项的value值绑定到InfoSite.ResType属性,最终存入数据库的自然是主键值而非显示文本。
快速修改方案
直接调整视图中SelectList的字段绑定配置,将值字段从主键ID改为你需要存储的Description字段即可,修改后的下拉控件代码:
<select asp-for="InfoSite.ResType" id="Select1" class="form-select" asp-items="@(new SelectList(Model.DisplayResCatData,"Description", "Description"))"> <option value="" selected disabled>---Select Residence Type---</option> </select>
修改后渲染出的选项value和显示文本都会取Description字段的值,表单提交时ResType接收到的就是选中的分类显示文本,直接执行存库逻辑就能满足需求。
更稳妥的推荐方案
如果后续可能出现重名分类、或者需要防范前端参数篡改,建议不要修改前端value绑定,在后端提交逻辑中根据传入的主键ID查询对应显示文本再赋值,这种方式更符合常规开发规范,不需要改动视图代码,只需要调整OnPost方法:
public async Task<IActionResult> OnPost() { // 传入的ResType此时是分类ID,查询对应分类实体 if (int.TryParse(InfoSite.ResType, out int catId)) { var selectedCategory = await _db.ResCategory.FindAsync(catId); if (selectedCategory != null) { // 赋值为需要存储的显示文本 InfoSite.ResType = selectedCategory.Description; } } await _db.InfoSite.AddAsync(InfoSite); await _db.SaveChangesAsync(); TempData["success"] = "Site Information added successfully."; return RedirectToPage("Index"); }
两种方案都只需要少量代码调整即可实现需求,你可以根据自己的业务场景选择。
内容的提问来源于stack exchange,提问作者MelB
相关产品推荐
相关产品推荐

