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?
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ę.
@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.
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ł?
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.
@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.