ASP.NET Core 6 MVC下拉框绑定问题:保存仅存入ID而非选项文本
问题解决:下拉框绑定后仅保存ID,显示异常
问题分析
你的代码中外键设计符合关系型数据库规范——通过外键ID关联关联表,而非直接存储文本(避免数据冗余)。出现显示异常的原因有两个:
- 列表页查询时未加载关联的
BuyerSelectList和ItemSelectList实体,导致视图无法获取对应文本值; - 若表单提交后验证失败,未重新绑定下拉框数据,会导致视图下拉框无选项。
解决方案
1. 修改列表页查询,加载关联实体
修改BTBNewLien2Controller的Index方法,确保查询时包含关联实体:
public IActionResult Index() { // 加载关联表数据,根据你的UnitOfWork实现调整语法 IEnumerable<BTBNewLien2> objBTBNewLienList = _unitOfWork.BTBNewLien2.GetAll(includeProperties: "BuyerSelectList,ItemSelectList"); return View(objBTBNewLienList); }
如果你的GetAll方法不支持includeProperties参数,改用EF Core原生Include方法:
IEnumerable<BTBNewLien2> objBTBNewLienList = _unitOfWork.BTBNewLien2.GetAll() .Include(b => b.BuyerSelectList) .Include(b => b.ItemSelectList);
2. 修改列表视图,显示关联实体的文本属性
调整Index视图中的显示代码,直接指定要显示的属性:
@foreach (var BTBNewLien2 in Model) { <tr class="m-0"> <td> @Html.DisplayFor(modelItem => BTBNewLien2.BuyerSelectList.Buyer) </td> <td> @Html.DisplayFor(modelItem => BTBNewLien2.ItemSelectList.Item) </td> </tr> }
3. 修复表单验证失败后的下拉框绑定
在Create的Post方法中,若ModelState无效,重新绑定ViewBag的下拉列表:
[HttpPost] [ValidateAntiForgeryToken] public IActionResult Create(BTBNewLien2 obj) { if (ModelState.IsValid) { _unitOfWork.BTBNewLien2.Add(obj); _unitOfWork.Save(); TempData["success"] = "Row Created Successfully!"; return RedirectToAction("Index"); } // 验证失败时重新绑定下拉框数据 IEnumerable<SelectListItem> BuyerSelectList = _unitOfWork.Buyer.GetAll().Select( c => new SelectListItem { Text = c.Buyer, Value = c.Id.ToString() }); IEnumerable<SelectListItem> ItemSelectList = _unitOfWork.Item.GetAll().Select( c => new SelectListItem { Text = c.Item, Value = c.Id.ToString() }); ViewBag.BuyerSelectList = BuyerSelectList; ViewBag.ItemSelectList = ItemSelectList; return View(obj); }
补充说明
- 数据库中存储外键ID是正确设计,无需存储文本值,通过关联查询即可获取对应文本;
- 若强行在创建时保存文本(不推荐,会造成数据冗余),可在
BTBNewLien2模型中添加BuyerName、ItemName字段,但不符合关系型数据库设计规范。
内容的提问来源于stack exchange,提问作者Masum Rayhan
相关产品推荐
相关产品推荐

