Jak najlepiej stworzyć mechanizm stronnicowania?

0

witam
Chciałem się was zapytać jak najlepiej stworzyć mechanizm ort! (pobranie danych z bazy i wyświetlanie ich np. po 4 elementy na stronie) w asp.net mvc? Czy są jakieś gotowe biblioteki może?

1

Sama zasada jest dość prosta - w adresie przekazujesz aktualny numer strony, ewentualnie numer rekordu, od którego rozpoczynasz pobieranie rekordów, w aplikacji masz ustawione ile tych rekordów na stronie jest i wszystko już masz, a używając LINQ możesz w łatwy sposób sobie przetworzyć co trzeba. Poniżej przykłady.

Jeśli przekazujesz numer strony:

// przykładowa metoda
public ActionResult Index(int numerStrony) {

    //pobranie rekordow z bazy
    var rekordy = ...

    // zakładając, że masz gdzieś numer strony, przyjmijmy stałą NUMER_STRONY, wyliczasz sobie ile rekordów pominąć
    // zakładając, że masz gdzieś liczbę rekordów na stronie, przyjmijmy stałą LICZBA_REKORDOW_NA_STRONIE
    var pomin = (NUMER_STRONY - 1) * LICZBA_REKORDOW_NA_STRONIE;

    // lista rekordow do wyswietlenia
    var rekordyDoWyswietlenia = rekordy.Skip(pomin).Take(LICZBA_REKORDOW_NA_STRONIE);
    return View(rekordyDoWyswietlenia);
}

Jeśli przekazujesz liczbę rekordów do pominięcia:

// przykładowa metoda
public ActionResult Index(int liczbaRekordowDoPominiecia) {

    //pobranie rekordow z bazy
    var rekordy = ...

    // zakładając, że masz gdzieś numer strony, przyjmijmy stałą NUMER_STRONY, wyliczasz sobie ile rekordów pominąć
    // zakładając, że masz gdzieś liczbę rekordów na stronie, przyjmijmy stałą LICZBA_REKORDOW_NA_STRONIE

    // lista rekordow do wyswietlenia
    var rekordyDoWyswietlenia = rekordy.Skip(liczbaRekordowDoPominiecia).Take(LICZBA_REKORDOW_NA_STRONIE);
    return View(rekordyDoWyswietlenia);
}

Teraz pozostaje tylko wyświetlić sobie w pętli wszystkie rekordy, które przekazujesz do widoku jako model.
To jest najprostsze rozwiązanie, nie mniej jednak zadziała. Polecałbym tylko opakować to w jakiś helper.

Jeśli chodzi o biblioteki to nie korzystałem z żadnej zewnętrznej biblioteki do stronicowania, więc wypowiedzieć się nie mogę.

3

@cisu, czyli ładujemy wszystkie rekordy z bazy, potem je filtrujemy, a na końcu konwertujemy? Jak to zadziała dla tabeli z 10 tys rekordów? A z mliionem?

Filtrowanie, sortowanie i stronicowanie to zadanie dla warstwy dostępu do danych, która będzie potrafiła to zrobić w miarę wydajnie generując sensowne zapytanie do bazy. A kontroler to nie jest miejsce na pobieranie danych z bazy.

0

somekind a czy mógłbyś rozszerzyć swoją wypowiedź? Wcześniej właśnie chciałem zrobić sposobem podobnym do tego co zaproponował cisu. Jak ty byś to widział?

2

Chodzi o to, że w warstwie modelu tworzysz sobie metodę, która przyjmuje jako parametr numer strony i ilość rekordów na stronę i mając te informacje wybierasz z bazy odpowiednią ilość rekordów. Czyli np. chcesz pobrać rekordy dla strony drugiej, gdzie ilość rekordów na stronę wynosi 5, to pobierasz rekordy od 6 do 10. Jeżeli używasz LINQ na tej twojej bazie, to wygooglowałem, że możesz uzyć 'Take' i 'Skip' do tego, co wydaje się dosyć eleganckie. Pewnie będziesz potrzebował też jakąś klasę pomocniczą, żeby tą paginację jakoś ładnie wyrenderować użytkownikowi (w sensie ilość, obecny indeks strony).

Btw na 99% istnieje do tego jakiś plugin jeśli szukasz gotowego rozwiązania.

0

@Wizzie Ja podałem przykład jak to można łatwo rozwiązać, napisałem też, że należy to jakoś obudować, żeby nie robić tego w kontrolerze. Swoją drogą pobranie danych to jedno, a ich późniejsze obrabianie to już co innego. Można całość zrealizować w modelu, ale nie trzeba.

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