Tôi nghe nói rằng có @foreach bên trong chế độ xem là điều không nên. Có nghĩa là, khung nhìn không nên có bất kỳ logic nào trong đó. Thực tiễn tốt nhất về vị trí logic cho @foreach nên ở đâu?
@foreach..
Tôi nghe nói rằng có @foreach bên trong chế độ xem là điều không nên. Có nghĩa là, khung nhìn không nên có bất kỳ logic nào trong đó. Thực tiễn tốt nhất về vị trí logic cho @foreach nên ở đâu?
@foreach..
Câu trả lời:
Thực tiễn tốt nhất về vị trí logic cho @foreach nên ở đâu?
Không đâu, chỉ cần thoát khỏi nó. Bạn có thể sử dụng trình chỉnh sửa hoặc các mẫu hiển thị.
Ví dụ:
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
hoàn toàn có thể được thay thế bằng một mẫu hiển thị:
@Html.DisplayFor(x => x.Foos)
và sau đó bạn sẽ xác định mẫu hiển thị tương ứng (nếu bạn không thích mẫu mặc định ). Vì vậy, bạn sẽ xác định một mẫu có thể sử dụng lại ~/Views/Shared/DisplayTemplates/Foo.cshtml
sẽ tự động được khung hiển thị cho từng phần tử của Foos collection ( IEnumerable<Foo> Foos { get; set; }
):
@model Foo
<div>@Model.Bar</div>
Rõ ràng là chính xác các quy ước giống nhau áp dụng cho các mẫu trình soạn thảo nên được sử dụng trong trường hợp bạn muốn hiển thị một số trường đầu vào cho phép bạn chỉnh sửa mô hình chế độ xem trái ngược với việc chỉ hiển thị nó ở dạng chỉ đọc.
foreach
gì? Ít nhất thì một mẫu hiển thị (trong khi một cách tiếp cận hoàn toàn có thể chấp nhận được, bất kể) yêu cầu một chế độ xem mới được hiển thị, điều này không miễn phí. Phần lớn thời gian nó sẽ không ảnh hưởng đáng kể đến thời gian tải trang web của bạn, nhưng nếu thực hiện đủ, nó có thể gây ra hiệu suất. Một foreach
chút về HTML luôn và sẽ gần như ngay lập tức. Như tôi đã nói, nó không phải là một vấn đề lớn, mặc dù vậy, nhưng nếu có bất cứ điều gì có một lý lẽ để sử dụng foreach
.
Khi mọi người nói rằng đừng đưa logic vào các khung nhìn, họ thường đề cập đến logic nghiệp vụ, không phải logic hiển thị. Theo ý kiến khiêm tốn của tôi, tôi nghĩ việc sử dụng @foreach trong lượt xem là hoàn toàn tốt.
Tôi đang sử dụng @foreach
khi tôi gửi một thực thể có chứa danh sách các thực thể (ví dụ: để hiển thị 2 lưới trong 1 chế độ xem)
Ví dụ: nếu tôi đang gửi dưới dạng mô hình thực thể Foo chứa Foo1(List<Foo1>)
vàFoo2(List<Foo2>)
Tôi có thể tham khảo Danh sách đầu tiên với:
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
một câu trả lời cho @DarinDimitrov cho trường hợp tôi đã sử dụng foreach trong chế độ xem dao cạo.
<li><label for="category">Category</label>
<select id="category">
<option value="0">All</option>
@foreach(Category c in Model.Categories)
{
<option title="@c.Description" value="@c.CategoryID">@c.Name</option>
}
</select>
</li>
Html.DropDownListFor
sẽ chỉ đơn giản là tính đến tiêu đề? Đó là tầm thường và không bật quan điểm của bạn vào mã spaghetti: stackoverflow.com/a/7938038/29407
optgroup
các phần tử trong danh sách được chọn, vì không có hỗ trợ cho điều đó trong HtmlHelpers. Nếu bạn chỉ cần thêm một mục bổ sung vào danh sách đã chọn, có nhiều cách tốt hơn để đạt được điều đó và sau đó vẫn sử dụng trình trợ giúp.
Câu trả lời sẽ không hoạt động khi sử dụng quá tải để chỉ ra mẫu @Html.DisplayFor(x => x.Foos, "YourTemplateName)
.
Có vẻ như được thiết kế theo cách đó, hãy xem trường hợp này . Ngoài ra, ngoại lệ mà khuôn khổ đưa ra (về loại không được như mong đợi) khá gây hiểu lầm và đánh lừa tôi trong lần thử đầu tiên (cảm ơn @CodeCaster)
Trong trường hợp này bạn phải sử dụng@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}
IEnumerable<T>
và gọi mẫu cho kiểu T
cho mỗi phần tử.