Html.DisplayFor có thể tự động lặp qua các bộ sưu tập, trưng bày một cái nhìn cục bộ cho mỗi phần tử trong bộ sưu tập.
Điều đầu tiên bạn cần làm là tạo một lớp mô hình thực tế, với bộ sưu tập là thuộc tính của lớp.
public class Bar
{
public IEnumerable<Foo> foo { get; set; }
}
Trả lại lớp này từ bộ điều khiển của bạn thay vì thu thập nguyên liệu.
Thứ hai, bạn cần mẫu hiển thị cho lớp Foo. Các mẫu hiển thị là các khung nhìn một phần cần được đặt trong thư mục Views/Shared/DisplayTemplates
.
Chỉnh sửa: Bạn cũng có thể có chúng trong thư mục con của trình điều khiển của Chế độ xem nếu bạn muốn giới hạn mẫu cho một bộ điều khiển cụ thể. Xem this question để biết thêm thông tin.
Dưới đây là một ví dụ trong cú pháp cạo:
@model YourNameSpace.Foo
<p>@Model.BarBaz</p>
Lưu nó như Foo.cshtml
trong thư mục DisplayTemplates
đưa ra ở trên.
Mẫu này khá đơn giản vì nó dựa trên ví dụ của bạn nơi bạn chỉ hiển thị một chuỗi, nhưng nếu các thành phần thu thập trong đó một lớp có thuộc tính riêng của nó, bạn có thể tạo một mẫu phức tạp hơn.
Bây giờ trong giao diện ban đầu, bạn có thể thoát khỏi vòng lặp hoàn toàn và chỉ cần viết
@Html.DisplayFor(m => m.foo)
Thông báo foo
là tên của thuộc tính trong lớp học mô hình mới của bạn có chứa bộ sưu tập cũ bạn looped kết thúc trước khi .
DisplayFor sẽ tự động biết rằng foo
tài sản là loại (bộ sưu tập) Foo
và nhặt Foo.cshtml
mẫu trong thư mục DisplayTemplates
và hiển thị nó một lần cho mỗi phần tử trong foo
.
Nguồn
2014-02-19 23:36:34
Tôi nghĩ rằng, tôi thậm chí còn ngu ngốc hơn, vì tôi không chắc chắn làm thế nào để giải thích điều này. Tham số chính thức lambda m không được sử dụng trong biểu thức. Vì vậy, điều này chỉ có bởi vì nó được yêu cầu bởi _DisplayFor_? Ngoài ra, tôi hy vọng rằng '@ Html.Display (item.BarBaz)' cũng hoạt động tốt, nhưng điều đó không làm gì cả. –
@ R.Schreurs Có vẻ như lambda cần phải là một biểu thức 'Func' lấy kiểu của mô hình làm tham số, nhưng nó có thể trả về bất cứ thứ gì. – JohnnyHK
Tôi cũng ngu ngốc :) –