ASP.NET MVC详情页加载触发ViewDataDictionary模型类型不匹配异常求助
问题根因
MVC框架要求控制器传递给视图的模型类型,必须和视图头部@model声明的接收类型一致。你当前的控制器Details方法查询的是Planner_App.Models.TJob类型的对象,返回视图时直接传入了该对象,但你的视图声明要求接收的是Planner_App.Models.TJobHistory类型,二者类型不匹配因此抛出该异常。
解决方向
结合你需要在详情页同时展示指定TJob条目和对应审计记录的需求,推荐使用**视图模型(ViewModel)**的方案,这也是MVC开发的标准最佳实践,具体步骤如下:
- 新建视图模型类,用来同时承载任务基础信息和审计记录数据
// 可放在项目的Models/ViewModels目录下 public class JobDetailsViewModel { // 存储TJob基础信息 public TJob JobBaseInfo { get; set; } // 存储对应TJob的所有审计记录 public List<TJobHistory> JobAuditList { get; set; } }
- 修改控制器查询逻辑,关联查询审计记录并组装视图模型
public async Task<IActionResult> Details(int? id) { if (id == null) { return NotFound(); } var jobData = await _context.TJob .Include(t => t.intCustomer) .Include(t => t.intDeveloper) .Include(t => t.intJobStatus) .Include(t => t.intJobType) // 关联查询对应审计记录,这里替换为你TJob类中关联TJobHistory的导航属性名即可 .Include(t => t.TJobHistories) .FirstOrDefaultAsync(m => m.intJobId == id); if (jobData == null) { return NotFound(); } // 组装视图模型 var viewData = new JobDetailsViewModel { JobBaseInfo = jobData, JobAuditList = jobData.TJobHistories?.ToList() ?? new List<TJobHistory>() }; return View(viewData); }
- 修改视图的模型声明为对应的视图模型
@model Planner_App.Models.ViewModels.JobDetailsViewModel @{ ViewData["Title"] = "Details"; }
修改完成后,你在视图中就可以通过Model.JobBaseInfo获取任务的基础信息,通过Model.JobAuditList遍历展示所有的操作审计记录。
如果你的需求是详情页仅需要展示审计记录不需要任务基础信息,可直接调整控制器的查询逻辑,根据传入的id查询对应的TJobHistory集合返回给视图即可,同时注意视图的模型声明要对应改为集合类型@model IEnumerable<Planner_App.Models.TJobHistory>。
内容的提问来源于stack exchange,提问作者user11053570
相关产品推荐
相关产品推荐

