在我当前的应用程序中,我正在生成一个相当长的表格来显示给用户。我已经看到了一些严重的性能问题,我已经追踪到 @Html.DisplayFor 的使用,我不完全确定为什么。
编辑:我已经用更简洁和可重现的设置替换了代码示例。
为了隔离问题,我使用 Visual Studio 中的所有默认设置创建了一个新的 asp.net core MVC 项目,没有进行身份验证。我这样创建了一个视图模型:
public class TestingViewModel
{
public int Id { get; set; }
public string TextValue1 { get; set; }
public string TextValue2 { get; set; }
}
然后添加了一个控制器,它用数据填充视图模型以传递给视图:
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);
}
视图是显示数据的最低限度:
@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)
}
运行此代码时,运行时间超过一秒!罪魁祸首是DisplayFor。如果我按如下方式更改视图:
@model List<DisplayForTest.ViewModels.TestingViewModel>
@foreach (var item in Model)
{
@item.Id
@item.TextValue1
@item.TextValue2
}
这会在 13 毫秒内呈现。很明显,DisplayFor 正在为渲染增加大量时间……在我的 PC 上,每次调用将近 0.4 毫秒。虽然这在孤立的情况下还不错,但对于列表或其他事情来说,它是一个非常糟糕的选择。
真的DisplayFor
就这么慢吗?还是我使用不当?