C# 使用带有IEnumerable的显示模板是否会导致速度缓慢?
因此,我决定从这里看到的关于使用C# 使用带有IEnumerable的显示模板是否会导致速度缓慢?,c#,asp.net-mvc,performance,templates,C#,Asp.net Mvc,Performance,Templates,因此,我决定从这里看到的关于使用IEnumerable时使用显示模板的“正确”方法的大量帖子中获得一些乐趣 我有一个正在创建的表,对于这些行,我制作了一个单独的显示模板。本例中的模型是一个IEnumerable: 工作编号 零件号 测试员 通过/不通过 测试日期 @if(Model.Any()) { 使用(MiniProfiler.Current.Step(“渲染表”)) { DisplayFor(model=>model); } } 其他的 { 无结果-更新搜索字段 } 模板: @mod
IEnumerable
时使用显示模板的“正确”方法的大量帖子中获得一些乐趣
我有一个正在创建的表,对于这些行,我制作了一个单独的显示模板。本例中的模型是一个IEnumerable
:
工作编号
零件号
测试员
通过/不通过
测试日期
@if(Model.Any())
{
使用(MiniProfiler.Current.Step(“渲染表”))
{
DisplayFor(model=>model);
}
}
其他的
{
无结果-更新搜索字段
}
模板:
@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>
@model PartTest
@DisplayFor(model=>model.JobNumber)
@DisplayFor(model=>model.PartNumber)
@DisplayFor(model=>model.Tester)
@if(型号IsPassing)
{
通过
}
其他的
{
失败
}
@DisplayFor(model=>model.TestDate)
我正在使用区域,因此路径是~/Areas/PartsTesting/Views/Shared/PartTest.cshtml
。
当我运行这个时,它运行得非常慢。我是说有时候10-15秒。这个数据集并不是太离谱,但有时它可以超过100个项目,在这种情况下,我提供了一个滚动条,但我不认为渲染100行会导致这种缓慢
当我切换到只手动迭代for循环中的项目并跳过显示模板时,它在大约40毫秒内运行了200多个项目。这是怎么回事?为什么我使用显示模板时速度这么慢(从我所读到的内容来看,这是一种“更好的”MVC编写方式)?如中所述
启用调试时,我们不会缓存从视图名称到视图文件的映射
设置debug=true将禁用优化的代码路径以协助调试。在您的特定情况下,它将禁用视图位置缓存
似乎每次调用Html.DisplayFor都会搜索匹配的模板。显然,这个文件操作,以及所有的助理检查文件是否存在等都非常慢
将debug设置为false将优化此问题
就我个人而言。。。。
我建议您尝试使用Html.RenderPartial而不是Html.DisplayFor
不过,专家认为,这将面临同样的问题。我一直讨厌模板,认为它们是“旧的skool”我认为它在循环的每个迭代中都会查找文件。将debug设置为false这很有趣。当我关闭调试时,速度相当。我不确定在时间上的差异是可以容忍的,尽管我保证使用显示模板。在测试时,每次运行等待时间可能超过20秒是不可接受的。我喜欢使用显示模板的概念,但不会以浪费时间为代价。我个人也不喜欢模板。我建议你试试偏观instead@Ewan如果你想写出来作为答案,我会接受。@Ewan:Display/editor模板是局部视图。在性能方面,使用
Html.DisplayFor
与Html.Partial
之间绝对没有区别,因为它们本质上做的是相同的事情:渲染部分视图。重要的是要提到Html.RenderPartial
只有在部分视图同时处理整个可枚举对象时才会更有效。显示模板的本质是只处理单个项,因此必须为枚举中的每个项呈现模板。为for循环中的每个项目调用Html.RenderPartial
的情况完全相同。我相信你的话,虽然它显然略有不同,因为你指定了视图名称,它寻找的是视图而不是模板等。也许OP可以运行一个快速测试?这是我另一个评论的要点。它们都是观点。显示样板只是一个局部视图。它只是一个在命名和位置上遵循特定约定的工具,使它能够与DisplayFor
一起工作。好的,我测试了它。两者对我来说都同样快debug=true mvc 5I切换到使用for循环,只是将显示模板移动到父视图中。我最初是根据其他SO用户的建议尝试的,在这个例子中,我发现这完全是浪费时间。它对其他事情很有用,但这不是其中之一。
@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>