Slow DisplayFor ASP.NET Core MVC中的性能

Dod*_*ler 6 c# razor displayfor asp.net-core-mvc asp.net-core

在我当前的应用程序中,我正在生成一个相当冗长的表格以显示给用户.我已经看到了一些严重的性能问题,我已经追溯到使用@ Html.DisplayFor,我不完全确定原因.

编辑:我已经用更简洁和可重复的设置替换了代码示例.

为了解决这个问题,我使用visual studio中的所有默认设置创建了一个新的asp.net核心MVC项目,没有身份验证.我创建了一个视图模型:

public class TestingViewModel
{
    public int Id { get; set; }
    public string TextValue1 { get; set; }
    public string TextValue2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后添加了一个控制器,它使用数据填充视图模型以传递给视图:

    public IActionResult TestThings()
    {
        var list = new List<TestingViewModel>();
        for(var i = 0; i < 1000; i++)
            list.Add(new TestingViewModel {Id = i, TextValue1 = "Test", TextValue2 = "Test2"});

        return View(list);
    }
Run Code Online (Sandbox Code Playgroud)

视图是显示数据的最低限度:

@model List<DisplayForTest.ViewModels.TestingViewModel>

@foreach (var item in Model)
{
    @Html.DisplayFor(m => item.Id)
    @Html.DisplayFor(m => item.TextValue1)
    @Html.DisplayFor(m => item.TextValue2)
}
Run Code Online (Sandbox Code Playgroud)

运行此代码时,运行需要一秒钟!罪魁祸首是DisplayFor.如果我更改视图如下:

@model List<DisplayForTest.ViewModels.TestingViewModel>

@foreach (var item in Model)
{
    @item.Id
    @item.TextValue1
    @item.TextValue2
}
Run Code Online (Sandbox Code Playgroud)

这将在13毫秒内呈现.很明显DisplayFor在我的电脑上添加了大量的时间......每次通话接近0.4毫秒.虽然这在隔离方面并不坏,但它使列表或其他东西成为一个非常糟糕的选择.

是否DisplayFor真的只是慢?还是我错误地使用它?

Wil*_*Ray 3

DisplayFor 真的那么慢吗?还是我使用方式不对?

计算和执行 lambda 表达式需要一些开销。首先,框架必须验证它,然后评估它我在这里进行了一些推测,但这似乎就是性能问题的根源;这两种方法都需要反思。

我使用过的所有其他显示方法(ValueForDisplayTextFor等)在您的示例中都具有相同的性能效果。

我无法代表 MVC 团队解释为什么将它用于默认脚手架,但它对我来说确实有意义。DisplayFor可以处理两种最常见的用例(显示属性的值和使用自定义模板显示属性的值),并且在大多数情况下表现得相当好。

.ToString在这种情况下,我认为仅使用原始值(基本上是ing 它)或根据您要查找的内容在Html.Encode/方法中使用它没有问题。Html.Raw

  • 感谢您的帮助!经过一番研究后,我倾向于直接输出常规类型,并使用 TagHelpers 或 HtmlHelpers 来显示更复杂的类型。我预计标签助手会产生一些成本,但它们看起来确实很有效。 (2认同)