如何防止局部视图中的延迟加载,自定义显示/编辑器模板

本文关键字:显示 自定义 编辑器 延迟加载 局部 何防止 视图 | 更新日期: 2023-09-27 18:13:45

在我的ASP.NET MVC 4 web应用程序中,我使用了部分视图和自定义显示/编辑器模板来模块化代码。一个例子是User.cshtmlDisplayTemplate,它接受User(一个实体对象(并打印出他们的名称和一个图标来弹出他们的目录信息。

视图/Shared/DisplayTemplates/User.cshtml

@model MyApp.Domain.Entities.User
@if (Model != null) {
  @Html.DisplayFor(m => m.DisplayName)
  <span class="view-contact icon ui-icon ui-icon-contact" title="View Contact"></span>
  @Html.HiddenFor(m => m.Identity)
}

当我搜索这个话题时,我遇到了与大多数人相反的问题。我注意到,当我使用这个模板时,会触发延迟加载,因此会向数据库发送一个查询来获取数据,但如果我已经预加载了数据,我不希望发生这种情况,尤其是在我显示用户列表的情况下。在这种情况下,我确保在我的查询中使用.Include("User"(,当我在视图中基本上写出模板的代码时,信息显示没有问题或额外的查询:

Views/MyController/List.cshtml 的简化摘录

...
@foreach (var item in Model) {
  <tr>
    <td class="alignl">
      @item.User.DisplayName
      <span class="view-contact icon ui-icon ui-icon-contact" title="View Contact"></span>
      @Html.HiddenFor(m => item.User.Identity)
    </td>
  </tr>
}
...

如果我用对模板的调用替换这三行,那么每一行都会查询数据库。

@foreach (var item in Model) {
  <tr>
    <td class="alignl">
      @Html.DisplayFor(i => item.User)
    </td>
  </tr>
}

如何在不触发不必要的查询的情况下使用此模板?

如何防止局部视图中的延迟加载,自定义显示/编辑器模板

根据@GertArnold的建议,我仔细查看了获取用户集合的主查询,并试图查看是否可以禁用延迟加载。因为我使用的是通用的存储库模式和工作单元,所以我无法仅为该调用专门禁用它,所以我最终直接使用了上下文,并且一切都正常运行,而无需禁用——这打破了我的模式,但我现在可以使用投影,并避免我的应用程序急切地加载不必要的数据列。

如果有人能为我指明在通用存储库中实现投影的正确路径,我会很高兴,但我现在可以接受这种替代解决方案。

这篇msdn文章也有助于:https://msdn.microsoft.com/en-us/data/jj574232.aspx