如何防止部分视图中的延迟加载,自定义 Display/Editor 模板?
How to prevent lazy loading in partial views, custom Display/Editor Templates?
在我的 ASP.NET MVC 4 Web 应用程序中,我利用部分视图和自定义 display/editor 模板来模块化代码。一个例子是 User.cshtml DisplayTemplate,它接受用户(一个实体对象)并打印出他们的名字和一个图标来弹出他们的目录信息。
Views/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
在我的 ASP.NET MVC 4 Web 应用程序中,我利用部分视图和自定义 display/editor 模板来模块化代码。一个例子是 User.cshtml DisplayTemplate,它接受用户(一个实体对象)并打印出他们的名字和一个图标来弹出他们的目录信息。
Views/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