【发布时间】:2015-09-19 18:11:03
【问题描述】:
在我的 ASP.NET MVC 4 Web 应用程序中,我利用部分视图和自定义显示/编辑器模板来模块化代码。一个例子是 User.cshtml DisplayTemplate,它接受 User(一个实体对象)并打印出他们的名字和一个图标来弹出他们的目录信息。
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>
}
如何使用此模板而不触发不必要的查询?
【问题讨论】:
-
究竟何时触发延迟加载,延迟加载what?你知道你可以关闭延迟加载吗?
-
它在视图中的 foreach 循环期间加载,并查询数据库以从用户表中返回用户。我将查找为单个请求禁用延迟加载并尝试一下。谢谢。
-
@GertArnold 感谢您的建议。我最终并没有特别禁用延迟加载,但它确实引导我走上了一条产生预期结果的道路。我如何感谢您帮助我找到答案?
-
没关系。如果您能分享自己问题的答案,那就太好了。
标签: c# asp.net-mvc asp.net-mvc-4 linq-to-entities lazy-loading