You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:52:14