Pytanie o projekt obecnych implementacji paginacji

12

Sprawdziłem implementacje paginacji konkretnie na asp.net mvc i naprawdę czuję, że jest coś mniej wydajnego we wdrożeniach.

Przede wszystkim wszystkie implementacje używają wartości stronicowania jak poniżej.

public ActionResult MostPopulars(int pageIndex,int pageSize)
{

}

Rzeczą, w której czuję się źle, jest pageIndex i pageSize całkowicie należące do klasy Pagination, w przeciwnym razie ten sposób wygląda tak funkcjonalnie. Upraszcza to również niepotrzebne przekazywanie parametrów na poziomach aplikacji.

Po drugie, używają interfejsu poniżej.

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    int PageNumber { get; }
    int PageSize { get; }
    bool HasPreviousPage { get; }
    bool HasNextPage { get; }
    bool IsFirstPage { get; }
    bool IsLastPage { get; }
} 

Jeśli chcę przekierować moją paginację na inną akcję, muszę utworzyć nowy model widoku, aby zawrzeć w nim nazwę akcji, a nawet nazwę kontrolera. Innym rozwiązaniem może być przesłanie tego modelu interfejsu do podglądu, a następnie określenie parametru i kontrolera na stałe w metodzie pager jako parametru, ale tracę całkowicie możliwość ponownego użycia mojego widoku, ponieważ jest to ściśle zależne tylko od jednej akcji.

Inną rzeczą jest to, że używają poniżej kodu w widoku

Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount)

Jeśli modelem jest IPagedList, dlaczego nie zapewniają metody przeciążenia takiej jak @Html.Pager(Model)lub nawet lepszej @Html.Pager(). Wiesz, że znamy typ modelu w ten sposób. Przed popełnieniem błędu, ponieważ korzystałem z Model.PageIndex zamiast Model.PageNumber.

Innym dużym problemem jest to, że mocno polegają na interfejsie IQueryable. Skąd wiedzą, że używam IQueryable w mojej warstwie danych? Spodziewałbym się, że będą działać po prostu ze zbiorami, które utrzymują ignorancję przy wdrażaniu paginacji.

Co jest złego w moich pomysłach na ulepszenia w porównaniu do ich stronicowania? Jaki jest ich powód, aby nie wprowadzać w życie ich paginacji w ten sposób?

Świeża krew
źródło
Wydaje mi się to dość skomplikowane. Nie do końca rozumiem, na czym dokładnie polega problem, ale ... czy naprawdę potrzebujesz korzystać z wbudowanych pomocników? Nawet nie wiedziałem, że mają pager. Opracowałem kolekcję własnych pomocników od czasów MVC 1 Beta po moich pierwszych (i nieudanych) próbach dogadania się z wbudowanymi pomocnikami. Polecam ci to samo. Jeśli zmagasz się z tymi pomocnikami, nie jest to lepsze niż WebForms, w których zmagasz się z kontrolkami serwera.
ASP.NET MVC nie ma wbudowanych pomocników stronicowania, istnieją tylko implementacje stronicowania stron trzecich.
Freshblood
Dziękuję za tę odrobinę informacji. Pytanie brzmi, dlaczego potrzebujesz takiego? Nie ma problemu z wdrożeniem go samodzielnie, tak jak chcesz.
Chciałem tylko wiedzieć, że w moich pomysłach jest coś nie tak. Czy złamałem kilka podstawowych zasad, jeśli nie, to dlaczego wszyscy stosowali ten sam projekt w swoich implementacjach ... Nie rozumiem
Freshblood
jeśli kod nie może rozwiązać problemu programisty, kod nie ma wartości, lepiej go nie używaj.
Shaheer

Odpowiedzi:

1

Jak stwierdził user8685: twój interfejs wydaje się zbędny w stosunku do istniejących rzeczy i zasad MVC.

Spróbuj: informacje wymagane od IPagedList, takie jak indeks strony itp., Powinny zostać zaimplementowane w warstwie logiki biznesowej i przekazane do widoku / strony za pomocą ogólnego modelu, który można przekazać z powrotem do serwera i tam bezpiecznie przesłać i przetworzyć. Dlaczego? Ponieważ to, co tutaj gromadzisz, jest wyraźnie wkładem do twojego systemu informacyjnego i jako takie należy do warstw niższych niż interfejs użytkownika.

Ta droga może nie być najlepszym sposobem i na pewno nie jest najszybsza, ale powinna ułatwić zobaczenie, czego naprawdę potrzebujesz w zakresie abstrakcji i architektury danych, a tym samym pomóc w usunięciu nadmiarowości.

Ponadto istniejący pomocnicy często zawierają zbyt wiele narzutów, aby można je było łatwo wykorzystać, a czasem zaciemniają duży obraz.

abstrakcyjny
źródło
0

Nie korzystałem z tej IPagedList ani pomocnika, ale to moje zdanie:

MostPopular(int pageIndex,int pageSize)Wyraźna interfejs stwierdzając: Wrócę tylko strony z mostpopular rzeczy. Wyraźnie mówisz mi, która strona i jej rozmiar.

Jeśli zastosowali metodę kontrolera, MostPopular(IPagedList<T> page)interfejs staje się bardziej mylący. Podajesz kontrolerowi całkowitą liczbę przedmiotów, czy nie?

Gdy kontroler pobiera określony stronicowany wycinek danych, zwykle może odkryć różne inne dane, na przykład liczbę wszystkich elementów. W tym momencie sensowne jest zwracanie takich danych do widoku, aby mógł selektywnie korzystać z niektórych z nich.

To nie znaczy, że IPagedList jest modelu, to może równie dobrze być częścią modelu (właściwość na nim). Prawdopodobnie dlatego nie występuje przeciążenie bez parametrów.

Mogli dodać IPagedList jako przeciążenie, ale wtedy przekazalibyśmy zestaw (stronicowany fragment danych) do małego pomocnika pagera, który nie potrzebuje samych danych. Musi tylko wiedzieć, ile stron / pozycji w tej chwili jesteś, aby mógł podświetlić numer strony i tym podobne. Powiedziałbyś pomocnikowi o wiele więcej niż musi wiedzieć, aby wykonać swoją pracę. To, jak teraz działa, ma dolne sprzęgło, co jest dobrą rzeczą.

Joppe
źródło
Chciałem tylko powiedzieć, że parametrem metody akcji może być obiekt, który ma właściwość o nazwie PageIndex i PageSize, więc w ten sposób moglibyśmy łatwo zweryfikować model, ponieważ ktoś może zepchnąć ogromną ilość stron do atakowania wydajności serwera. A jeśli spowodują przeciążenie bez parametrów, to przeciążenie bez parametrów będzie przydatne, gdy model ma IPagedList. Nie ma nic złego, jeśli przekazuję więcej danych, niż potrzebuje pomocnik. Nie ma tak ścisłej zasady, jak najlepsza praktyka.
Freshblood
0

Biorąc pod uwagę, że to, o co klient prosi o numer strony, i to, co najprawdopodobniej się zmieni, to rozmiar strony:

public ActionResult MostPopulars(int pageIndex,int pageSize)

To całkiem rozsądny sposób na zrobienie tego. Widziałem różne warianty, w których zastosowano ennum (pierwszy, następny, poprzedni, ostatni), ale tak naprawdę to po prostu niezręczny sposób na powiedzenie „pageIndex”.

Chciałbym powtórzyć, że rozmiar strony będzie i powinien się bardzo różnić, w zależności od zaangażowanego użytkownika powinieneś uzyskać różne ustawienia domyślne dla telefonów komórkowych, przenośnych i dużych stacji roboczych, a ponadto w wielu przypadkach rozsądne jest, aby użytkownik końcowy mógł wybrać, ile elementów stanowi Strona.

Wiem, że skutkuje to przekazywaniem wielu parametrów w ramach MVC, ale cała koncepcja stronicowania psuje MVC - logika biznesowa musi wiedzieć o prezentacji, aby stronicowanie działało, więc zawsze będzie bałagan.

James Anderson
źródło