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真的只是慢?还是我错误地使用它?
DisplayFor 真的那么慢吗?还是我使用方式不对?
计算和执行 lambda 表达式需要一些开销。首先,框架必须验证它,然后评估它。我在这里进行了一些推测,但这似乎就是性能问题的根源;这两种方法都需要反思。
我使用过的所有其他显示方法(ValueFor、DisplayTextFor等)在您的示例中都具有相同的性能效果。
我无法代表 MVC 团队解释为什么将它用于默认脚手架,但它对我来说确实有意义。DisplayFor可以处理两种最常见的用例(显示属性的值和使用自定义模板显示属性的值),并且在大多数情况下表现得相当好。
.ToString在这种情况下,我认为仅使用原始值(基本上是ing 它)或根据您要查找的内容在Html.Encode/方法中使用它没有问题。Html.Raw
| 归档时间: |
|
| 查看次数: |
1601 次 |
| 最近记录: |