You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC详情页加载触发ViewDataDictionary模型类型不匹配异常求助

问题根因

MVC框架要求控制器传递给视图的模型类型,必须和视图头部@model声明的接收类型一致。你当前的控制器Details方法查询的是Planner_App.Models.TJob类型的对象,返回视图时直接传入了该对象,但你的视图声明要求接收的是Planner_App.Models.TJobHistory类型,二者类型不匹配因此抛出该异常。

解决方向

结合你需要在详情页同时展示指定TJob条目和对应审计记录的需求,推荐使用**视图模型(ViewModel)**的方案,这也是MVC开发的标准最佳实践,具体步骤如下:

  1. 新建视图模型类,用来同时承载任务基础信息和审计记录数据
// 可放在项目的Models/ViewModels目录下
public class JobDetailsViewModel
{
    // 存储TJob基础信息
    public TJob JobBaseInfo { get; set; }
    // 存储对应TJob的所有审计记录
    public List<TJobHistory> JobAuditList { get; set; }
}
  1. 修改控制器查询逻辑,关联查询审计记录并组装视图模型
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);
}
  1. 修改视图的模型声明为对应的视图模型
@model Planner_App.Models.ViewModels.JobDetailsViewModel
@{    
    ViewData["Title"] = "Details";
}

修改完成后,你在视图中就可以通过Model.JobBaseInfo获取任务的基础信息,通过Model.JobAuditList遍历展示所有的操作审计记录。

如果你的需求是详情页仅需要展示审计记录不需要任务基础信息,可直接调整控制器的查询逻辑,根据传入的id查询对应的TJobHistory集合返回给视图即可,同时注意视图的模型声明要对应改为集合类型@model IEnumerable<Planner_App.Models.TJobHistory>。

内容的提问来源于stack exchange,提问作者user11053570

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 14:06:05