ASP.NET Core MVC中List转IEnumerable隐式转换失败求助
解决RuntimeBinderException:无法将List转换为IEnumerable
这个问题的根源很明确——你在控制器里给ViewBag.Locations赋值的类型和视图asp-items要求的类型不匹配!
问题分析
你其实已经做了正确的转换步骤:把InventoryLocations实体列表转换成了SelectListItem的集合(就是这段代码):
var locations = locationsList.OrderBy(l => l.LocationName).Select(us => new SelectListItem { Value = us.LocationId.ToString(), Text = us.LocationName }).ToList();
但最后你错误地把**原始的实体列表locationsList**赋值给了ViewBag.Locations,而不是转换后的locations集合。视图里的asp-items标签助手需要的是IEnumerable<SelectListItem>类型,框架无法自动把实体转换成SelectListItem,自然会抛出类型转换异常。
修复步骤
只需要修改控制器里的ViewBag赋值代码:
// 把这行错误代码 ViewBag.Locations = locationsList; // 改成正确的赋值 ViewBag.Locations = locations;
优化后的完整控制器代码(可选)
你还可以简化代码,去掉多余的locationsList变量,直接链式查询:
// GET: ~/Inventory/Locate/Id public IActionResult Locate(int Id) { InventoryLocationsHistoryViewModel locationsHistoryVM = new InventoryLocationsHistoryViewModel(); // 直接从数据库查询并转换为SelectListItem集合 var locations = _context.InventoryLocations .OrderBy(l => l.LocationName) .Select(us => new SelectListItem { Value = us.LocationId.ToString(), Text = us.LocationName }) .ToList(); ViewBag.Locations = locations; // 其他业务逻辑... return View(locationsHistoryVM); }
额外建议(可选)
看你的视图里asp-for="LocationName",如果你的ViewModel是想存储选中的位置ID,建议把ViewModel里的属性改成int LocationId,然后视图里的asp-for改成LocationId,这样更符合常规的下拉框绑定逻辑(绑定ID而非文本),避免后续可能出现的匹配问题。
内容的提问来源于stack exchange,提问作者user9335731
相关产品推荐
相关产品推荐

