C# / Razor - licznik wykonań pętli

0

Witam,
sprawa banalna ale nie dla bardzo początkującego.
Mam taką pętle:

@model IEnumerable<Praca.Models.Food>
@using Praca.DAL

@foreach (var food in Model)
{
    <div class="col-xs-12">
        <div style="padding: 10px; margin: 10px;" class="foodListBox">
            <div style="width: 50px; height: 50px; background-color: firebrick; border-radius: 50%;">
                <p style="text-align:center; line-height: 50px;">@food.FoodId</p>
            </div>
            <h3 style="text-align: center;">@food.Name</h3> <p style="text-align: center;">@food.Calories kcal | @food.Price zł</p>
            <hr />
            <p style="text-align: center;">@food.Description</p>
            <hr />
        </div>
    </div>
}

Wyświetla mi wszystkie elementy o które proszę. Chce zrobić prosty licznik który ponumeruje mi w widoku pozycje od 1 do ilości elementów.
Czy ja muszę tworzyć osobne pole w klasie, czy może mogę zastosować zmienną lokalną ? Coś w stylu int "i=0; i++"
Kompletnie przerasta mnie póki co składnia razor.
Pozdrawiam
EDIT
Wartości oczywiście bez bazy danych, tylko w aktualnym widoku. Po prostu mam 6 hamburgerów w bazie, więc wyświetla mi 6, a ja chce przy każdym dać liczbę porządkową.
Nie moge zrobić tego po ID bo np. chce wyświetlić 2, 4 i 6 element... i zamiast 1,2,3 mam 2,4,6

0

Można to zrobić w taki sposób:

foreach (var food in Model.Select((Value, i) => new { Value, Index = i + 1 }))
{
    <p>NR: @food.Index</p>
    <p style="text-align:center; line-height: 50px;">@food.value.FoodId</p>
}

bądź trochę prościej i na pierwszy rzut oka bardziej zrozumiale:

for (var i=0, j=1; j <= Model.Count(); i++, j++)
{
     <p>NR: @j</p>
     <p style="text-align:center; line-height: 50px;">@Model[i].FoodId</p>
}
0

Ok ale jak zagnieździć te pętle bo teraz mi wyświetla ilość ale w każdym elemencie osobno...

@model IEnumerable<Praca.Models.Food>
@using Praca.DAL

@foreach (var food in Model)
{
    for (var i = 0; i < Model.Count(); i++)
    {
        <p>@i</p>
    }
    <div class="col-xs-12">
        <div style="padding: 10px; margin: 10px;" class="foodListBox">
            <div style="width: 50px; height: 50px; background-color: firebrick; border-radius: 50%;">
                <p style="text-align:center; line-height: 50px;">@food.FoodId</p>
            </div>
            <h3 style="text-align: center;">@food.Name</h3> <p style="text-align: center;">@food.Calories kcal | @food.Price zł</p>
            <hr />
            <p style="text-align: center;">@food.Description</p>
            <hr />

        </div>
    </div>
}

Jest to oczywiste ale nie mam pomysłu jak to rozwiązać...

0

Wybierz pętle którą chcesz użyć (z tych dwóch które podałem) i użyj jej na wszystko. Nie musisz zagnieżdżać.

0

Ok licznik działa, ale jak się odwołać do zmiennych modelu ? moje poprzednie @model.name lub podane przez Ciebie @Model[i].name nie działa...
"do wyrażenia IEnumerable<food> nie można zastosować indeksowania przy użyciu konstrukcji []"

0

Ahh no tak nie zauważyłem. Jeżeli przez for to musisz zwrócić listę czyli IList zamiast IEnumerable (bo to zwykła kolekcja która nie ma indeksów więc nie można odwołać się do konkretnego obiektu). Nie Model.name tylko Model.value.name. :)

0

Nadal jest problem i nie mogę odwołać się do zmiennej (w podpowiedziach nie mam nawet "value"), próbuję różnych kombinacji i nadal nic...

@model IList<Praca.Models.Food>
@using Praca.DAL


@for (var i = 1; i <= Model.Count(); i++)
{
<div class="col-xs-12">
    <div style="margin: 0; padding: 40px 0; border-bottom: 1px dashed white; border-right: 1px dashed whitesmoke; border-radius: 0 0 50px 0;" class="row">
        <div class="col-xs-10">
            <div>
                <div style="width: 50px; height: 50px; background-color: firebrick; border-radius: 50%;">
                    <p style="text-align: center; line-height: 50px;">@i</p>
                </div>
**                <h2 style="text-align: left;">@Model.value.Name</h2>**
                <p style="text-align: left;">safasf, asfasg, asda, asdafgg afs, asdga, assasf, hgfasdf, asfasf</p>
                <p style="text-align: left;">231 kcal</p>
                <h3 style="text-align: left;">25 zł</h3>
                <a href="#" class="btn btn-lg btn-default"><span class="glyphicon glyphicon-plus"></span> Dodaj</a>
                <a href="#" style="background-color: firebrick; color: whitesmoke;" class="btn btn-lg"><span class="glyphicon glyphicon-edit"></span> Personalizuj</a>
            </div>
        </div>
        <div class="col-xs-2">
        </div>
    </div>
</div>
0

Strasznie się zaplątałeś.
Przeanalizuj linia po linii to, co w tym momencie robi Twój kod.

Skąd w znaczniku h2 ma pojawić się prawidłowa wartość skoro nie jest w żaden sposób powiązana z konkretnym elementem listy, po której iterujesz?
Wydaje mi się również, że kompletnie zapomniałeś o tym, że zamieniłeś pętlę foreach na for.

0
wisensane napisał(a):

Strasznie się zaplątałeś.
Przeanalizuj linia po linii to, co w tym momencie robi Twój kod.

Skąd w znaczniku h2 ma pojawić się prawidłowa wartość skoro nie jest w żaden sposób powiązana z konkretnym elementem listy, po której iterujesz?
Wydaje mi się również, że kompletnie zapomniałeś o tym, że zamieniłeś pętlę foreach na for.

Ok czyli mam tylko zwiększany licznik tyle razy ile razy przejdzie pętla w po Modelu.
Czy by mieć dostęp do pól Modelu muszę w tej pętli użyć ponownie foreach dla Model(i) ?

0

Nie musisz.
Próbowałeś w h2 wyświetlić @Model[i].Name?

W ostatnim zaprezentowanym przez Ciebie kodzie brakuje również wyświetlenia liczby porządkowej, na której Ci zależało oraz klamry domykającej pętlę for.

0

Mój kod bez html:

@model IList<Praca.Models.Food>
@using Praca.DAL


@for (var i = 1; i <= Model.Count(); i++)
{
      @i <- licznik, działa super
      @Model[i].Name <- nazwa, wywala błąd "System.ArgumentOutOfRangeException: „Indeks był spoza zakresu. Musi mieć wartość nieujemną i mniejszą niż rozmiar kolekcji.Nazwa parametru: index”
}

EDIT
Ok działa gdy ustawie i = 0 oraz i < Model.Count() lecz numeruje od zera...
Jakieś rozwiązanie ?

0

Możesz też spróbować przypisać taki sam name jakiegoś elementu w pętli, go wysyłać potem do kontrolera w formie listy i zliczyć jak długa jest lista

1 użytkowników online, w tym zalogowanych: 0, gości: 1