【发布时间】:2015-03-26 13:58:31
【问题描述】:
因此,我决定从这里看到的关于在使用 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 循环中的项目并一起跳过显示模板时,它在约 40 毫秒内运行了 200 多个项目。这里发生了什么?为什么我使用显示模板时会这么慢(从我读到的内容是为 MVC 编写“更好”的方式)?
【问题讨论】:
-
我认为它会在循环的每次迭代中查找文件。将调试设置为 false
-
这很有趣。当我关闭调试时,速度是可比的。我不确定时间差异是否可以容忍,但可以保证使用显示模板。每次运行等待可能超过 20 秒并不是我在测试时可以接受的时间。我喜欢使用显示模板的概念,但不以浪费时间为代价。
-
我个人也不喜欢模板。我建议你改用部分视图
-
@Ewan 如果你想把它写下来作为答案,我会接受的。
-
@Ewan:显示/编辑器模板是部分视图。使用
Html.DisplayFor和Html.Partial之类的东西在性能方面绝对没有区别,因为它们本质上做的是相同的事情:渲染局部视图。
标签: c# asp.net-mvc performance templates