Я чув, що наявність @foreach всередині подання - це ні-ні. Це означає, що погляд не повинен мати в собі жодної логіки. Яка найкраща практика щодо того, де повинна бути логіка для @foreach?
@foreach..
Я чув, що наявність @foreach всередині подання - це ні-ні. Це означає, що погляд не повинен мати в собі жодної логіки. Яка найкраща практика щодо того, де повинна бути логіка для @foreach?
@foreach..
Відповіді:
Яка найкраща практика щодо того, де повинна бути логіка для @foreach?
Ніде, просто позбудься цього. Ви можете використовувати редактор або шаблони відображення.
Так наприклад:
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
цілком можна замінити шаблоном відображення:
@Html.DisplayFor(x => x.Foos)
і тоді ви визначите відповідний шаблон відображення (якщо вам не подобається шаблон за замовчуванням ). Отже, ви визначите шаблон для багаторазового використання, ~/Views/Shared/DisplayTemplates/Foo.cshtml
який автоматично відображатиметься фреймворком для кожного елемента колекції Foos ( IEnumerable<Foo> Foos { get; set; }
):
@model Foo
<div>@Model.Bar</div>
Очевидно, що ті самі правила застосовуються до шаблонів редакторів, які слід використовувати на випадок, якщо ви хочете показати деякі поля введення, що дозволяють редагувати модель подання на відміну від простого відображення її як лише для читання.
foreach
? Щонайменше шаблон відображення (хоча цілком прийнятний підхід, незалежно від цього) вимагає надання нового подання, яке не є безкоштовним. Велику частину часу це не буде помітно впливати на час завантаження вашого сайту, але зроблено достатньо, це може призвести до досягнення продуктивності. foreach
Навколо трохи HTML і завжди буде практично миттєво. Як я вже говорив, в будь-якому випадку це не велика угода, але якщо що, є аргумент для використання foreach
.
Коли люди кажуть, що не вкладайте логіку у погляди, вони, як правило, мають на увазі ділову логіку, а не візуалізацію логіки. На мою скромну думку, я думаю, що використання @foreach у переглядах є цілком нормальним.
Я використовую, @foreach
коли надсилаю сутність, що містить список сутностей (наприклад, для відображення 2 сіток в 1 поданні)
Наприклад, якщо я посилаю як модель сутність Foo, яка містить Foo1(List<Foo1>)
іFoo2(List<Foo2>)
Я можу звернутися до першого списку за допомогою:
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
відповідь @DarinDimitrov на випадок, коли я використовував foreach у вигляді бритви.
<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
який просто враховуватиме заголовок? Це тривіально і не перетворює ваші погляди на код для спагетті: stackoverflow.com/a/7938038/29407
optgroup
елементів у списку вибору, оскільки в HtmlHelpers для цього немає підтримки. Якщо вам просто потрібно додати додатковий елемент до вибраного списку, є кращі способи досягти цього, а потім все одно використовувати помічник.
Відповідь не буде працювати при використанні перевантаження для позначення шаблону @Html.DisplayFor(x => x.Foos, "YourTemplateName)
.
Здається, розроблений таким чином, див. Цей випадок . Також виняток, який дає фреймворк (про тип не був таким, як очікувалось), є досить оманливим і звів мене з першої спроби (спасибі @CodeCaster)
У цьому випадку вам доведеться використовувати@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}
IEnumerable<T>
та викличе шаблон для типу T
для кожного елемента.