ASP.NET MVC视图内使用分部视图时出现模型类型不匹配错误如何解决
问题原因
- 核心类型不匹配:控制器
_ContactList方法从数据库查询返回的是List<mvc_project.Models.Contact>数据库实体类型,但是分部视图声明的接收模型是IEnumerable<mvc_project.ViewModels.ViewContactsVM>视图模型类型,二者不兼容导致报错。 - 传参缺失:你在Details页调用
@Html.Action("_ContactList")时没有传入id参数,控制器方法要求接收int id参数,即使类型匹配也会触发参数为空的报错。
修改方案
1. 调整控制器代码,添加实体到视图模型的映射
修改_ContactList方法,把查询到的Contact实体手动映射为ViewContactsVM,同时建议用PartialView替代View返回分部视图,避免自动加载全局布局:
public ActionResult _ContactList(int id) { using (var context = new mvc_projectEntities()) { var data = context.Contacts .Where(x => x.ClientID == id) // 手动映射实体到视图模型 .Select(c => new ViewContactsVM { ContactID = c.ContactID, ClientID = c.ClientID, ContactName = c.ContactName, ContactPhoneNumber = c.ContactPhoneNumber, ContactEmailAddress = c.ContactEmailAddress, JobTitle = c.JobTitle, AddedBy = c.AddedBy }) .ToList(); return PartialView(data); } }
如果项目中这类映射场景较多,也可以引入AutoMapper组件实现自动映射,简化代码。
2. 调整Details页调用代码,传入必填的id参数
你需要把当前详情页对应的ClientID传给分部视图方法,假设你的Details页的模型包含ClientID字段,修改调用代码如下:
@{ ViewBag.Title = "Details"; } <h2>Details</h2> @* 替换为你实际获取当前ClientID的方式,如用ViewBag存储则替换为ViewBag.ClientID *@ @Html.Action("_ContactList", new { id = Model.ClientID })
内容的提问来源于stack exchange,提问作者user1735489
相关产品推荐
相关产品推荐

