Подтвердить что ты не робот

Получение значения индекса для бритвы foreach

Я повторяю List<T> в бритвенном цикле foreach в моем представлении, которое делает частичным. В частичном я представляю одну запись, для которой я хочу иметь 4 строки в моем представлении. У меня есть класс css для двух конечных столбцов, поэтому необходимо определить в частичном, является ли вызов первой или четвертой. Каков наилучший способ идентифицировать это в моей частичной для вывода правильного кода?

Это моя главная страница, которая содержит цикл:

@foreach (var myItem in Model.Members){

        //if i = 1
        <div class="grid_20">
        <!-- Start Row -->

        //is there someway to get in for i = 1 to 4 and pass to partial?
        @Html.Partial("nameOfPartial", Model)

        //if i = 4 then output below and reset i to 1
        <div class="clear"></div>
        <!-- End Row -->
        </div>

}

Я полагаю, что я могу создать int, который я могу обновить на каждом проходе, и визуализировать текст без проблем здесь, но он передаёт целочисленное значение в мою частичную, меня больше беспокоит. Если не будет лучшего способа.

Вот мои частичные:

@{
switch()
case 1:
        <text>
        <div class="grid_4 alpha">
        </text>
break;
case 4:
        <text>
        <div class="grid_4 omega">
        </text>
break;
default:
        <text>
        <div class="grid_4">
        </text>
break;
}

        <img src="Content/960-grid/spacer.gif" style="width:130px; height:160px; background-color:#fff; border:10px solid #d3d3d3;" />
        <p><a href="member-card.html">@Model.Name</a><br/>
        @Model.Job<br/>
        @Model.Location</p>
</div>

Не уверен, что сегодня у меня день блондинки, и это ужасно легко, но я просто не могу придумать, как наилучшим образом передать значение int. Надеюсь, кто-то может помочь.

4b9b3361

Ответ 1

 @{int i = 0;}
 @foreach(var myItem in Model.Members)
 {
     <span>@i</span>
     @{i++;
      }
 }

//Используйте @{i++ для увеличения значения}

Ответ 2

//this gets you both the item (myItem.value) and its index (myItem.i)
@foreach (var myItem in Model.Members.Select((value,i) => new {i, value}))
{
    <li>The index is @myItem.i and a value is @myItem.value.Name</li>
}

Дополнительная информация о моем сообщении в блоге http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

Ответ 3

Или вы могли бы просто сделать это:

@foreach(var myItem in Model.Members)
{    
    <span>@Model.Members.IndexOf(myItem)</span>
}

Ответ 4

Взгляните на это решение, используя Linq. Его пример похож на то, что ему нужна разная разметка для каждого третьего элемента.

foreach( var myItem in Model.Members.Select(x,i) => new {Member = x, Index = i){
    ...
}

Ответ 5

Есть ли причина, по которой вы не используете селектор CSS для стилизации первого и последнего элементов вместо того, чтобы пытаться присоединить к ним свой собственный класс? Вместо стиля, основанного на альфа или омеге, используйте имя первого и последнего ребенка.

http://www.quirksmode.org/css/firstchild.html

Ответ 6

IndexOf кажется полезным здесь.

@foreach (myItemClass ts in Model.ItemList.Where(x => x.Type == "something"))
    {
       int currentIndex = Model.ItemList.IndexOf(ts);
       @Html.HiddenFor(x=>Model.ItemList[currentIndex].Type)

...

Ответ 7

Все вышеперечисленные ответы требуют логики в представлении. Представления должны быть глупыми и содержать как можно меньше логики. Почему бы не создать в модели представления свойства, соответствующие позиции в списке, например:

public int Position {get; set}

В своем конструкторе моделей вы устанавливаете позиции с 1 по 4.

НО.. есть даже более чистый путь. Почему бы не сделать класс CSS свойством вашей модели представления? Таким образом, вместо оператора switch в вашем партиале, вы просто должны сделать это:

<div class="@Model.GridCSS">

Переместите оператор switch в конструктор моделей представлений и заполните там класс CSS.

Ответ 8

В случае, если вы хотите посчитать ссылки из вашей модели (то есть: у Клиента есть Адрес в качестве ссылки, поэтому вы хотите подсчитать, сколько адресов существует для клиента) в цикле foreach на ваш взгляд, например:

 @foreach (var item in Model)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DtCadastro)
                                </td>

                                <td style="width:50%">
                                    @Html.DisplayFor(modelItem => item.DsLembrete)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DtLembrete)
                                </td>
                                <td>
                                    @{ 
                                        var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();
                                    }
                                    <button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>
                                    <button class="btn-link associar" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Create/@item.IdLembrete"><i class="fas fa-plus"></i></button>
                                </td>
                                <td class="text-right">
                                    <button class="btn-link delete" data-id="@item.IdLembrete" data-path="/Lembretes/Delete/@item.IdLembrete">Excluir</button>
                                </td>
                            </tr>
                        }

сделать как закодировано:

@{ var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();}

и используйте его так:

<button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>

ps: не забудьте добавить INCLUDE к этой ссылке у вас в DbContext, например, в вашем контроллере действий индекса, на случай, если это модель IEnumerable.

Ответ 9

Очень просто:

     @{
         int i = 0;
         foreach (var item in Model)
         {
          <tr>
          <td>@(i = i + 1)</td>`
          </tr>
         }
      }`