Trong ứng dụng hiện tại của tôi, tôi tạo ra một bảng khá dài để hiển thị cho người dùng. Tôi đã nhìn thấy một số vấn đề hiệu suất nghiêm trọng với nó, mà tôi đã theo dõi xuống để sử dụng @ Html.DisplayFor, và tôi không hoàn toàn chắc chắn lý do tại sao.Hiển thị chậmĐể thực hiện trong ASP.NET Core MVC
Chỉnh sửa: Tôi đã thay thế mẫu mã bằng thiết lập ngắn gọn và có thể lặp lại.
Để tách biệt vấn đề, tôi đã tạo một dự án MVC lõi asp.net mới sử dụng tất cả các cài đặt mặc định trong studio trực quan, không có xác thực. Tôi tạo ra một mô hình quan điểm như vậy:
public class TestingViewModel
{
public int Id { get; set; }
public string TextValue1 { get; set; }
public string TextValue2 { get; set; }
}
Sau đó, thêm một bộ điều khiển mà lấp đầy mô hình xem có dữ liệu để chuyển cho quan điểm:
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);
}
Quan điểm là trần tối thiểu có thể hiển thị dữ liệu :
@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)
}
Khi chạy mã này, phải mất hơn một giây để chạy! Thủ phạm là DisplayFor. Nếu tôi thay đổi chế độ xem như sau:
@model List<DisplayForTest.ViewModels.TestingViewModel>
@foreach (var item in Model)
{
@item.Id
@item.TextValue1
@item.TextValue2
}
Điều này hiển thị trong 13ms. Rõ ràng DisplayFor đang thêm một lượng thời gian rất lớn để hiển thị ... trên PC của tôi gần như 0,4 mili giây cho mỗi cuộc gọi. Trong khi đó không phải là xấu trong sự cô lập, nó làm cho nó một sự lựa chọn khá xấu cho danh sách hoặc những thứ khác.
Là DisplayFor
thực sự chỉ chậm? Hoặc tôi đang sử dụng nó không chính xác?
'DisplayFor' sử dụng sự phản chiếu để truy cập mọi thuộc tính trong đối tượng của bạn, điều này có thể kích hoạt tải xuống của EF nếu đó là thuộc tính điều hướng. Đây có thể là những gì đang xảy ra. – Dai
Một lý do nữa khiến bạn không nên sử dụng mô hình kiên trì trong chế độ xem của mình, thay vào đó hãy sử dụng các kiểu xem. Mặc dù chúng tôi không biết những gì OP sử dụng, EFCore không có lazy Loading thực hiện được nêu ra, chỉ EF6 – Tseng
Tôi đang sử dụng EFCore cho việc này.Tôi đã nhanh chóng chuyển đổi nó sang mô hình xem và chọn dữ liệu với 'members.Select (s => new MembersListViewModel {Id = s.Id}). ToList();', nhưng dường như có cùng vấn đề hiệu suất. – Doddler