Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用带有IEnumerable的显示模板是否会导致速度缓慢?_C#_Asp.net Mvc_Performance_Templates - Fatal编程技术网

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>