在我当前的应用程序中,我生成了一个相当长的表格以显示给用户。我已经看到了一些严重的性能问题,我已经跟踪了@ Html.DisplayFor的使用情况,并且我不完全确定为什么。在ASP.NET Core MVC中缓慢的DisplayFor性能MVC
编辑:我用更简洁和可重现的设置替换了代码示例。
为了找出问题,我使用visual studio中的所有默认设置创建了一个新的asp.net核心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
}
这在13ms呈现。很明显,DisplayFor在我的个人电脑上增加了大量的时间来渲染......每次通话时间将近0.4ms。虽然这不是孤立的,但它使它成为列表或其他事物的一个非常糟糕的选择。
是DisplayFor
真的就这么慢吗?或者我使用不正确?
'DisplayFor'使用反射来访问对象中的每个属性,如果它是导航属性,则可能会触发EF延迟加载。这可能是发生了什么事情。 – Dai
为什么不应该在视图中使用持久性模型的另一个原因是使用视图模型。虽然我们不知道OP使用什么,但EFCore没有延迟加载实现,只有EF6 – Tseng
我正在使用EFCore。我很快将它转换为视图模型,并使用'members.Select(s =>新的MembersListViewModel {Id = s.Id})。ToList();'选择数据,但它似乎具有相同的性能问题。 – Doddler