2016-10-13 21 views
5

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.

DisplayFor thực sự chỉ chậm? Hoặc tôi đang sử dụng nó không chính xác?

+2

'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

+0

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

+0

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

Trả lời

2

DisplayFor có thực sự chậm không? Hoặc tôi đang sử dụng nó không chính xác?

Mất một chút phí để đánh giá và thực thi các biểu thức lambda. Trước tiên, khung phải có validate it, sau đó evaluate it. Tôi đang suy đoán một chút ở đây, nhưng có vẻ như đây là nơi mà các mối quan tâm hiệu suất đến từ; cả hai phương pháp này đều yêu cầu sự phản chiếu.

Tất cả các phương pháp hiển thị khác mà tôi đã chơi cùng với (ValueFor, DisplayTextFor, v.v.) có cùng tác dụng hiệu suất trong ví dụ của bạn.

Tôi không thể nói cho nhóm MVC về lý do tại sao nó được sử dụng cho giàn giáo mặc định, nhưng nó có ý nghĩa với tôi. DisplayFor có thể xử lý cả hai trường hợp sử dụng phổ biến nhất (hiển thị giá trị của thuộc tính và hiển thị giá trị của thuộc tính bằng mẫu tùy chỉnh) và hoạt động tốt trong hầu hết các trường hợp.

Trong trường hợp này, tôi không thấy vấn đề gì khi chỉ sử dụng giá trị thô (về cơ bản là .ToString nhập) hoặc sử dụng phương pháp trong phương thức Html.Encode/Html.Raw tùy thuộc vào những gì bạn đang tìm kiếm.

+0

Có công bằng khi kết luận rằng đối với các loại không cần các mẫu hiển thị tùy chỉnh như thế này, 'DisplayFor' có quá mức cần thiết không? Rõ ràng với tôi rằng tôi không thể dựa vào nó nếu tôi muốn có nhiều hồ sơ này có thể nhìn thấy trên trang. Với 10 cột, mỗi hàng tôi render sẽ lấy máy chủ 4-5ms bằng cách sử dụng 'DisplayFor', điều này không thực sự chấp nhận được. Tôi đã thử 'ValueFor', và trong khi nó nhanh hơn một chút, nó vẫn rất chậm. Lý do chính mà tôi đang sử dụng nó là vì giàn giáo tự động thiết lập nó với nó. Nếu đây là hành vi mong đợi, tôi có thể chấp nhận nó như là câu trả lời. – Doddler

+0

@Doddler Bạn chính xác về hiệu suất 'ValueFor' - câu trả lời của tôi hơi lệch một chút. Tôi đã cập nhật câu trả lời của mình để giải quyết câu hỏi tốt hơn. –

+2

Cảm ơn sự giúp đỡ của bạn! Sau khi rối tung xung quanh với nó một chút, tôi nghiêng về hướng thẳng ra các loại thông thường, và sử dụng TagHelpers hoặc HtmlHelpers để hiển thị các loại phức tạp hơn. Tôi dự kiến ​​sẽ phải trả một số chi phí cho người giúp đỡ thẻ nhưng họ có vẻ thực sự hiệu quả. – Doddler

Các vấn đề liên quan