视图中的 MVC4 模型问题:在调试模式下模型缺少详细信息

Posted

技术标签:

【中文标题】视图中的 MVC4 模型问题:在调试模式下模型缺少详细信息【英文标题】:MVC4 Model in View issue: in debug mode Model is missing details 【发布时间】:2012-10-28 19:04:56 【问题描述】:

我遇到了一个非常奇怪(也很烦人)的问题: 在 MVC 4 Web 应用程序中,同时从数据库加载数据并在视图中的模型上使用 foreach:

@foreach (var meeting in Model)

我在方法的开头有一个断点,检查对象会议我发现它丢失了一些数据(引用其他表)。如果我在会议中打开 (+) 其他对象,则会出现丢失的数据。

为什么?

谢谢!

这是我的控制器方法:

        public ActionResult GetMeetingMR(int id = 0)
    
        var meetingPurpose = db.MeetingPurposes.ToList();
        ViewBag.MeetingPurpose = new SelectList(meetingPurpose, "MeetingPurposeID", "MeetingPurposeName");
        ViewBag.MRID = id;
        List<Meeting> meetings = (db.MortgageRequests.Find(id)).Meetings.ToList();
        return View(meetings);

    

【问题讨论】:

您的问题与 MVC4 无关,而与您如何使用 EF 从数据库加载数据有关。您所体验的是 Entity-Framework 中延迟加载的效果。因此,请发布您的数据加载代码,让我们为您提供帮助。 嗨@nemesv 我刚刚用我的控制器中的代码编辑了这个问题。谢谢。 【参考方案1】:

在您的问题中包含您的标题,我猜您在没有附加调试器的情况下(还)没有遇到问题。 正如其他人评论的那样,这是由于LazyLoading。 有时可能会出现此问题,因为在渲染 View 时,实体容器正在被释放,很可能是因为它是由调用容器的析构函数的 GarbageCollector 收集的。 如果您希望访问 View 上的实体,可以在 ObjectSet 上使用 Include。 假设MeetingPurposes 有一个关联的EntitySet Dates: 如果您希望将它们包含在加载操作中,您可以执行以下操作: db.MeetingPurposes.Include("Dates").ToList();

public ActionResult GetMeetingMR(int id = 0)

    //Load the MeetingPurposes including their dates
    var meetingPurpose = db.MeetingPurposes.Include("Dates").ToList();
    ViewBag.MeetingPurpose = new SelectList(meetingPurpose,
                                            "MeetingPurposeID",
                                            "MeetingPurposeName");
    ViewBag.MRID = id;
    List<Meeting> meetings = (db.MortgageRequests.Find(id)).Meetings.ToList();
    return View(meetings);

如果您希望为 Meetings 执行此操作,并且 Meetings 有一个 EntitySetDates,您可以这样做:

public ActionResult GetMeetingMR(int id = 0)

    var meetingPurpose = db.MeetingPurposes.ToList();
    ViewBag.MeetingPurpose = new SelectList(meetingPurpose,
                                            "MeetingPurposeID",
                                            "MeetingPurposeName");
    ViewBag.MRID = id;
    var meetings = (from mee in db.Meetings.Include("Dates")
                    join mga in dbo.MortgageRequests.Where(m => m.Id == id)
                    on mee.MortgageRequestID equals mga.ID
                    select mee).ToList();
    return View(meetings);

不太确定你的Find 扩展方法是什么,所以我在MortgageRequests 上使用了Where

【讨论】:

嗨@Silvermind,谢谢你的回答。到目前为止,我已经尝试了这些选项:db.Meetings.Include(m =&gt; m.MortgageRequest.Meetings).Where(m =&gt; m.MortgageRequest.MortgageRequestID == id).ToList() 和:db.MortgageRequests.Include(m =&gt; m.Meetings).Where(m =&gt; m.MortgageRequestID == id).First().Meetings.ToList(); 我仍然没有得到对象中的数据。在您的第二个示例中,您是否创建另一个 DBContext dbo? @Shlo 您要访问的导航属性的名称是什么?我不是在创建 DbContext,我假设您已经拥有一个。 我尝试访问两个导航属性:SetToUser 和 SetByUser。这些属性是对 UserProfile 的引用。我确实有一个 dbContext。谢谢。 我将查询更改为:db.Meetings.Include(m =&gt; m.SetByUser).Where(m =&gt; m.MortgageRequest.MortgageRequestID == id).ToList();,它可以工作。我认为是因为我在查询中包含了导航属性?

以上是关于视图中的 MVC4 模型问题:在调试模式下模型缺少详细信息的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC4 视图中的模型和 ItemModel 绑定

API 控制器中的 MVC4 模型验证服务器端

如何根据 asp.net mvc4 中的模型列表填充 ListBox?

通过两个具有相关日期的模型来查看 MVC4

MVC4 将模型从视图传递到控制器

MvvmCross - 在启用链接所有程序集的情况下缺少视图模型参数