ASP.NET视图模型类型不匹配异常求助
ASP.NET请求处理时的InvalidOperationException异常排查与解决
在ASP.NET项目处理请求时触发未处理的InvalidOperationException,错误提示:传入ViewDataDictionary的模型类型为System.Linq.Enumerable+WhereListIterator1[TicketsUA.Models.Tickets],但该ViewDataDictionary需要TicketsUA.Models.Tickets`类型的模型。
测试项目中直接用ToListAsync()在Index页显示所有数据正常,但原项目中FindTickets方法查询后返回结果到声明为@model IEnumerable<TicketsUA.Models.Tickets>的视图时,问题仍然存在。
相关控制器代码
public async Task<IActionResult> FindTickets(Tickets tickets) { var AllTickets = await _tickets.GetAll(); var find = AllTickets.Where(ti => ti.StartAirport == tickets.StartAirport && ti.EndAirport == tickets.EndAirport); return View(find); }
相关视图声明
@model IEnumerable<TicketsUA.Models.Tickets>
排查与解决步骤
- 确认视图匹配:检查
FindTickets方法返回的视图是否为目标视图(若未指定视图名称,默认返回同名的FindTickets.cshtml),确保该视图的模型声明确实是IEnumerable<TicketsUA.Models.Tickets>,而非单个Tickets对象。 - 转换查询结果为具体集合:
Where方法返回的是延迟执行的迭代器类型,将其转换为List<T>后再传递给视图,确保类型匹配:var find = AllTickets.Where(ti => ti.StartAirport == tickets.StartAirport && ti.EndAirport == tickets.EndAirport).ToList(); return View(find); - 检查同名视图冲突:确认项目中不存在其他文件夹下的同名视图,避免控制器错误返回了模型声明不同的视图。
- 验证数据源返回类型:确认
_tickets.GetAll()方法返回的是IEnumerable<Tickets>或其派生类型,不存在返回单个Tickets对象的情况。
内容的提问来源于stack exchange,提问作者Роман Парсанов
相关产品推荐
相关产品推荐

