所以我决定在这里看到关于&#34;纠正&#34;的众多帖子。使用IEnumerable<T>
时使用显示模板的方法。
我有一个正在创建的表,对于行,我创建了一个单独的显示模板。在这种情况下,模型是IEnumerable<PartTest>
:
<table>
<thead>
<tr>
<th>Job Number</th>
<th>Part Number</th>
<th>Tester</th>
<th>Pass / Fail</th>
<th>Test Date</th>
</tr>
</thead>
<tbody>
@if (Model.Any())
{
using (MiniProfiler.Current.Step("Render Table"))
{
Html.DisplayFor(model => model);
}
}
else
{
<tr>
<td colspan="5">No results - update search fields</td>
</tr>
}
</tbody>
</table>
模板:
@model PartTest
<tr>
<td>@Html.DisplayFor(model => model.JobNumber)</td>
<td>@Html.DisplayFor(model => model.PartNumber)</td>
<td>@Html.DisplayFor(model => model.Tester)</td>
<td>
@if (Model.IsPassing)
{
<div class="label label-success label-small">Passed</div>
}
else
{
<div class="label label-danger label-small">Failed</div>
}
</td>
<td>@Html.DisplayFor(model => model.TestDate)</td>
</tr>
我正在使用区域,因此路径为~/Areas/PartsTesting/Views/Shared/PartTest.cshtml
。
当我运行它时,它运行速度非常慢。我的意思是有时10-15秒。数据集并不令人愤慨,但有时它可能超过100个项目,在这种情况下我提供了一个滚动条,但我并不认为渲染100行会导致这种缓慢。
当我切换到只是手动迭代for循环中的项目并一起跳过显示模板时,它在~40ms内运行了200多个项目。这里发生了什么?当我使用显示模板时,为什么这么慢(从我读过的是#34;更好的&#34;为MVC编写的方式)?
答案 0 :(得分:0)
如http://forums.asp.net/t/1614418.aspx?+Html+DisplayFor+item+item+Property+extremely+slow
中所述“打开调试时,我们不会将视图名称中的映射缓存到视图文件”
“设置debug = true会禁用优化的代码路径以协助调试。在您的特定情况下,它会禁用视图位置缓存。”
似乎每次调用Html.DisplayFor都会搜索匹配的模板。显然这个文件操作,以及所有附带的检查文件是否存在等都很慢。
将debug设置为false将优化此问题。
虽然个人...... 我建议你尝试使用Html.RenderPartial而不是Html.DisplayFor。
虽然,专家意见认为这会遇到同样的问题。我一直讨厌模板并认为它们是“老skool”