InvalidCastException类型转换错误:视图传列表遇阻求助
嘿,这个错误的根源其实一眼就能看出来——你在视图里犯了个类型匹配的小错误:控制器里把**NavBarSettings类型的实例**存进了ViewData["NavBar"],但视图里却试图把它直接强制转换成List<NavBarItem>,这俩类型完全不是一回事,自然会抛出类型转换异常啦。
问题代码分析
先拆解下你的代码逻辑:
- 控制器端:你创建了
NavBarSettings对象,把Page.NavBar(这应该是你真正需要的List<NavBarItem>列表)传给它的构造函数,然后把整个NavBarSettings实例赋值给了ViewData["NavBar"]
public IActionResult Index() { var Page = new PageSettings("HomeControllerIndex"); ViewData["Page"] = Page; var NavBar = new NavBarSettings(Page.NavBar); ViewData["NavBar"] = NavBar; return View(); }
- 视图端:你直接把
ViewData["NavBar"]当成List<NavBarItem>来强转,这就踩坑了
@{ List<NavBarItem> Items = (List<NavBarItem>)ViewData["NavBar"]; }
解决方案
你需要先把ViewData["NavBar"]转换成正确的NavBarSettings类型,再从这个对象里取出它封装的List<NavBarItem>列表。
假设你的NavBarSettings类是这样定义的(根据构造函数传入Page.NavBar的逻辑推测):
public class NavBarSettings { // 假设这个属性用来存储传入的NavBarItem列表 public List<NavBarItem> NavBarItems { get; set; } public NavBarSettings(List<NavBarItem> navBarItems) { NavBarItems = navBarItems; } }
那你只需要修改视图代码,先转成正确的类型再取列表:
@using System.IO; @using System.Reflection; @using CMP.Helpers; @{ // 先转成正确的NavBarSettings类型 NavBarSettings navBarConfig = (NavBarSettings)ViewData["NavBar"]; // 再取出里面的列表(属性名换成你实际的字段名,比如如果是`NavBar`就写navBarConfig.NavBar) List<NavBarItem> Items = navBarConfig.NavBarItems; } @foreach (NavBarItem item in Items) { // 你的遍历渲染逻辑 }
额外优化建议
为了彻底避免这类运行时类型转换错误,推荐使用强类型视图:在视图顶部指定模型类型,控制器直接传递NavBarSettings对象给视图,这样编译阶段就能发现类型不匹配的问题,不用等到运行时才报错。
内容的提问来源于stack exchange,提问作者Abel
相关产品推荐
相关产品推荐

