ASP.NET MVC合并双模型为ViewModel后Razor视图类型不匹配报错处理
问题原因及解决方案
你遇到的类型不匹配错误主要由以下几个问题导致,按优先级修正即可:
1. 拼写不一致问题
你的代码中存在多处Security拼写错误:
- Employee实体中的导航属性写为
KeyBySecurtiyDepartment(缺少字母c,正确拼写为Security) - 错误提示中的
KeySecurtiyDepartment也为拼写错误 - 请确认ViewModel类名、控制器中引用的类名拼写完全一致,拼写错误会导致框架识别类型时出现偏差,误以为你传递的是实体类集合而非ViewModel。
2. 控制器变量大小写错误
你控制器代码中定义员工集合的变量名为大写开头的Employees,但给ViewModel赋值时用了小写的employees:
// 原错误代码 var Employees = db.Employees.Where(q => q.retired == false).ToList(); keyBySecurityDepartmentViewModel.employee= employees;
C#大小写敏感,你这里实际赋值时用的employees未定义,会导致编译失败,如果是粘贴代码时手误修正即可,确保变量名一致。
3. 实体类属性命名不合法
KeyBySecurityDepartment实体中存在大量数字开头的属性名:
// 错误命名,C#属性不能以数字开头 public bool 11Door { get; set; } public bool 111PostalBox { get; set; }
这类命名不符合C#语法规范,会导致模型绑定、序列化等操作异常,修改为合法命名后通过Column注解映射数据库原字段即可:
[Column("11Door")] public bool Door11 { get; set; } [Column("111PostalBox")] public bool PostalBox111 { get; set; }
4. 排查视图调用逻辑
如果以上问题都修正后还是报错,确认你没有其他重载的Index操作方法返回了List<KeyBySecurityDepartment>类型,也没有在其他地方调用该视图时传递了错误的模型参数。
修正完成后代码即可正常运行,视图可以正常遍历Model.employee输出员工编号。
内容的提问来源于stack exchange,提问作者Younesitoo
相关产品推荐
相关产品推荐

