Lõi ASP.Net: ViewComponent vs EditorTemplate / DisplayTemplate vs @inject


10

Vì vậy, tôi đã tìm kiếm một cách hay trong ASP.Net Core để tạo một số "điều khiển" hiển thị thành dạng xem. Cho đến nay tôi thấy có 3 tùy chọn và tôi muốn nhận được một số phản hồi về chúng.

  1. ViewComponents: Đây giống như các bộ điều khiển mini và sử dụng các phương thức như hành động để kết xuất từ ​​trang dao cạo (view). Tôi tin rằng họ có thể có logic khép kín nên không phụ thuộc vào bất kỳ mô hình xem cha mẹ nào.

  2. Các thư mục EditorTemplate / DisplayTemplate: Chúng tồn tại trong "Lượt xem / Chia sẻ /" và có thể được kéo vào dạng xem bằng cách chuyển một thuộc tính mô hình cho chúng (sử dụng DisplayFor()hoặc EditorFor()).

  3. @inject cho ASP.Net Core: Cho phép đưa một loại vào chế độ xem (Tôi không biết liệu một chế độ xem một phần có thể được liên kết không?).

  4. Tôi đang bỏ qua khả năng bao gồm các chế độ xem một phần trực tiếp, vì đó không phải là ý định của tôi đối với hệ thống kiểm soát mà tôi đang chuyển qua.

  5. Trình trợ giúp thẻ - cũng có thể đưa vào bối cảnh chế độ xem hiện tại và xây dựng các điều khiển từ những điều này.

Trong một ứng dụng ASP.NET MVC cũ hơn, tôi có một số điều khiển được hiển thị từ các mẫu (# 2). Tuy nhiên, đối với .Net Core, tôi dự tính có thể sử dụng ViewComponents (có vẻ mạnh hơn) để hiển thị các chế độ xem dao cạo liên quan (về cơ bản các điều khiển chỉ bao bọc các chế độ xem dao cạo). Hiện tại tôi sẽ thử nghiệm chuyển đổi sang ViewComponents, nhưng rất thích một số lời khuyên về vấn đề này, cảm ơn.

Câu trả lời:


2

Sử dụng ViewComponent nếu bạn có một số logic nghiệp vụ để chạy. Nó hỗ trợ nguyên tắc Tách mối quan tâm (SoC). Bạn có thể chèn tham số cho lớp ViewComponent từ chế độ xem (sử dụng tệp .cshtml của dao cạo). Chế độ xem ViewComponent có thể được tìm thấy trong Lượt xem / Chia sẻ / Thành phần . Nó có thể được gõ mạnh. ViewComponent sử dụng các cuộc gọi phương thức không đồng bộ, vì vậy người dùng không phải chờ tất cả nội dung của toàn bộ trang để tải. Hơn nữa, ViewComponent có thể được gọi là Trình trợ giúp thẻ: bạn cần thêm ViewCompenent làm Trình trợ giúp thẻ bằng cách sử dụng chỉ thị @addTagHelpers. Tính năng này cung cấp hỗ trợ cho trình soạn thảo dành cho nhà phát triển trong mẫu trình soạn thảo dao cạo.

Sử dụng Trình soạn thảo / Mẫu hiển thị khi chỉnh sửa hoặc hiển thị một số loại hoặc lớp nhất định. Ví dụ: bạn muốn chỉ định rằng đối tượng Sản phẩm phải xuất hiện cùng với bảng đặc tả. Nó bảo tồn nguyên tắc DRY trong ứng dụng MVC của bạn. Nó có thể được sử dụng như một khung nhìn một phần được mô hình liên kết với đối tượng mà nó muốn hiển thị.


0

Cách tiếp cận của tôi như sau ...

  1. Sử dụng ViewComponent để đóng gói logic nghiệp vụ về cách truy xuất các mô hình sẽ được hiển thị
  2. Nếu chế độ xem đích đơn giản và / hoặc đơn lẻ đặt html trực tiếp tại đây, nếu không, hãy sử dụng DisplayTemplate để hiển thị mô hình

Lý do là tôi vẫn nhận được sự tách biệt mối quan tâm giữa logic kinh doanh và kết xuất.

Như một ví dụ thực tế lấy một cái gì đó giống như một cấu trúc menu cụ thể theo ngữ cảnh; ViewComponent có thể xác định menu nào sẽ hiển thị và DisplayTemplate sau đó có thể hiển thị từng menu.


Hãy cẩn thận khi sử dụng chúng để tải dữ liệu. Một nhân viên của tôi đã làm điều đó và sau đó khi chúng tôi muốn xây dựng API REST cho AJAX (ví dụ: nếu ai đó muốn sử dụng Angular), thì logic đó nằm trong API và KHÔNG phải là các thành phần. ;) Nếu không sử dụng API REST cho trang web của bạn (phổ biến hiện nay), thì các thành phần được sử dụng tốt nhất để chỉ hiển thị bằng cách truyền dữ liệu cho chúng bằng các hành động của bộ điều khiển và trả về kết quả. Cuối cùng, tôi quyết định sử dụng Trình trợ giúp thẻ với bối cảnh hành động được chèn để xây dựng các điều khiển của tôi dưới dạng thẻ trong chế độ xem. Nó trông sạch sẽ hơn nhiều cuối cùng. ;)
James Wilkins

Tôi đưa dịch vụ api vào ViewComponent để thực sự thu được dữ liệu - nếu chúng ta cần cùng logic trả về html đích, ví dụ như sử dụng ajax để làm mới thành phần, thì tôi sẽ hiển thị thông qua phương thức điều khiển.
Paul Hatcher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.