【问题标题】:ViewDataDictionary Model Type ExceptionViewDataDictionary 模型类型异常
【发布时间】:2021-10-08 22:06:09
【问题描述】:

我正在运行一个包含两个主表的应用程序 - TJob 和 TJobHistory。 TJobHistory 表用作对 TJob 表中所做的任何更改的审计表。我正在尝试更改我的“详细信息”视图,以便显示用户在主页中单击的特定 TJob 条目的 TJobHistory。当我尝试加载任何 TJobs 条目的详细信息页面时,我遇到了以下异常:

InvalidOperationException:传递到 ViewDataDictionary 的模型项属于“Planner_App.Models.TJob”类型,但此 ViewDataDictionary 实例需要“Planner_App.Models.TJobHistory”类型的模型项。

控制器代码

        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            //Foreign key pulls//
            var TJob = await _context.TJob
                .Include(t => t.intCustomer)
                .Include(t => t.intDeveloper)
                .Include(t => t.intJobStatus)
                .Include(t => t.intJobType)
                .FirstOrDefaultAsync(m => m.intJobId == id);

            if (TJob == null)
            {
                return NotFound();
            }
            return View(TJob);
        }

查看代码

@model Planner_App.Models.TJobHistory
@{
    ViewData["Title"] = "Details";
}

我对 MVC 还是很陌生,所以如果这没有帮助,我深表歉意 - 但我似乎无法弄清楚我在这里做错了什么。如果有人能指出我正确的方向,将不胜感激!

【问题讨论】:

    标签: c# asp.net asp.net-mvc model-view-controller


    【解决方案1】:

    你必须修复你的视图模型

    @model Planner_App.Models.TJob
    

    或者如果你真的需要使用 TJobHistory 并且可以将 TJob 转换为 TJobHistory 你可以尝试这样的事情

    var model = await _context.TJob
                    .Include(t => t.intCustomer)
                    .Include(t => t.intDeveloper)
                    .Include(t => t.intJobStatus)
                    .Include(t => t.intJobType)
                    .Where(m => m.intJobId == id)
                    Select(i=> new TJobHistory
                     {
                       Id=i.Id,
                         ... TJobHistory properties
                      }).FirstOrDefaultAsync();
    
                if model == null)
                {
                    return NotFound();
                }
                return View(model);
    

    或者如果 TJobHistory 是 TJob 的副本,那么只需将 _context.TJob 替换为 _context.TJobHistory 就足够了

    var tJobHistory = await _context.TJobHistory
                ....
    

    【讨论】:

    • 感谢您的回复。在您说 Id=i.Id, TJobHistory 属性的 Select 部分中,您是什么意思?可以举个例子吗?
    • @Parker 如果你能看到 TJob 和 TJobHistory 类,我可以。请尽快发布。
    • 这里是我的课程截图的临时链接。 postimg.cc/gallery/mHLx7YV
    猜你喜欢
    • 1970-01-01
    • 2022-06-27
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2020-10-03
    • 2018-12-25
    相关资源
    最近更新 更多