Pertanyaan tentang desain implementasi pagination saat ini


12

Saya telah memeriksa implementasi pagination pada asp.net mvc secara khusus dan saya benar-benar merasa ada sesuatu yang kurang efisien dalam implementasinya.

Pertama-tama implementasi menggunakan nilai pagination seperti di bawah ini.

public ActionResult MostPopulars(int pageIndex,int pageSize)
{

}

Hal yang saya rasa salah adalah pageIndex dan pageSize benar-benar harus menjadi anggota kelas Pagination kalau tidak cara ini terlihat sangat fungsional. Juga menyederhanakan lulus paramater yang tidak perlu di tingkatan aplikasi.

Hal kedua adalah mereka menggunakan antarmuka di bawah ini.

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; }
} 

Jika saya ingin merutekan pagination ke tindakan yang berbeda, maka saya harus membuat model tampilan baru untuk mengenkapsulasi nama tindakan di dalamnya atau bahkan nama pengontrol. Solusi lain dapat mengirimkan model ini untuk melihat kemudian menentukan tindakan dan pengontrol hard coded dalam metode pager sebagai parameter tetapi saya kehilangan sepenuhnya re-usability dari pandangan saya karena sangat tergantung hanya pada satu tindakan.

Hal lain adalah mereka menggunakan kode di bawah ini dalam tampilan

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

Jika modelnya adalah IPagedList, mengapa mereka tidak menyediakan metode overload seperti @Html.Pager(Model)atau bahkan lebih baik @Html.Pager(). Anda tahu bahwa kita tahu tipe model dengan cara ini. Sebelum saya melakukan kesalahan karena saya menggunakan Model.PageIndex, bukan Model.PageNumber.

Masalah besar lainnya adalah mereka sangat bergantung pada antarmuka IQueryable. Bagaimana mereka tahu bahwa saya menggunakan IQueryable di lapisan data saya? Saya berharap bahwa mereka bekerja hanya dengan koleksi yang membuat implementasi pagination tetap tidak tahu.

Apa yang salah tentang ide peningkatan saya atas implementasi pagination mereka? Apa alasan mereka untuk tidak menerapkan pagination dengan cara ini?


Itu terlihat cukup rumit bagi saya. Bukannya saya cukup mengerti apa sebenarnya masalahnya, tapi ... apakah Anda benar-benar perlu menggunakan pembantu bawaan? Aku bahkan tidak tahu mereka punya pager. Saya telah mengembangkan koleksi pembantu saya sendiri sejak masa MVC 1 Beta setelah upaya pertama saya (dan gagal) untuk bergaul dengan pembantu bawaan. Saya merekomendasikan hal yang sama kepada Anda. Jika Anda berjuang dengan bantuan itu maka itu tidak lebih baik dari WebForms di mana Anda berjuang dengan kontrol server.

ASP.NET MVC tidak memiliki pembantu pagination yang dibangun hanya ada implementasi pagination pihak ketiga.
Freshblood

Terima kasih atas sedikit informasi itu. Pertanyaannya adalah, mengapa Anda membutuhkannya? Ini bukan upaya untuk mengimplementasikannya sendiri, seperti yang Anda inginkan.

Saya hanya ingin tahu apakah ada yang salah dengan ide saya. Apakah saya melanggar beberapa prinsip inti jika tidak jadi mengapa mereka semua mengikuti desain yang sama pada implementasi mereka .. saya tidak mengerti
Freshblood

jika kode tidak dapat menyelesaikan masalah programmer, kode tersebut tidak memiliki nilai, lebih baik Anda menghindari menggunakannya.
Shaheer

Jawaban:


1

Seperti yang dinyatakan oleh user8685: antarmuka Anda tampaknya berlebihan untuk hal dan prinsip MVC yang ada.

Coba ini: informasi yang Anda butuhkan dari IPagedList, seperti indeks halaman dll. Harus diimplementasikan dalam lapisan logika bisnis dan diumpankan ke tampilan / halaman melalui model generik yang dapat diumpankan kembali ke server dan dengan aman dicor dan diproses di sana. Mengapa? Karena apa yang Anda kumpulkan di sini dengan jelas adalah input ke sistem informasi Anda dan karena itu milik lapisan lebih rendah dari UI.

Cara ini mungkin bukan cara terbaik untuk pergi dan tentu saja bukan yang tercepat, tetapi akan membuatnya lebih mudah untuk melihat apa yang benar-benar Anda butuhkan dalam hal arsitektur abstraksi dan data dan dengan demikian membantu Anda menghilangkan redundansi.

Juga, pembantu yang ada sering mengandung terlalu banyak overhead untuk penggunaan sederhana dan kadang-kadang mengaburkan gambaran besar.


0

Belum pernah menggunakan IPagedList atau helper thingy ini, tetapi ini adalah pendapat saya:

Ini MostPopular(int pageIndex,int pageSize)adalah antarmuka eksplisit yang menyatakan: Saya hanya akan mengembalikan halaman hal MostPopular. Anda secara eksplisit memberi tahu saya halaman mana dan ukurannya.

Jika mereka membuat metode pengontrol MostPopular(IPagedList<T> page), antarmuka menjadi lebih membingungkan. Apakah Anda memberi tahu pengontrol jumlah total barang atau tidak?

Ketika pengontrol mengambil potongan halaman data spesifik Anda, ia biasanya dapat menemukan berbagai data lainnya, seperti berapa banyak item yang ada total. Pada titik ini, masuk akal untuk mengembalikan data tersebut ke tampilan, sehingga dapat digunakan secara selektif.

Ini tidak berarti bahwa IPagedList adalah yang model, bisa juga menjadi bagian dari model (properti di atasnya). Ini mungkin mengapa tidak ada kelebihan parameter-kurang.

Mereka bisa saja menambahkan IPagedList sebagai kelebihan beban tetapi kemudian Anda akan melewatkan satu set (sepotong paged data) ke pager helper kecil yang tidak memerlukan data aktual itu sendiri. Hanya perlu tahu berapa banyak halaman / item dan di mana Anda berada saat ini sehingga dapat menyorot nomor halaman dan semacamnya. Anda akan memberi tahu pembantu lebih dari yang perlu diketahui untuk melakukan pekerjaan itu. Cara kerjanya sekarang memiliki kopling lebih rendah, yang merupakan hal yang baik.


Saya hanya ingin mengatakan parameter metode tindakan dapat berupa objek yang memiliki properti bernama PageIndex dan PageSize sehingga dengan cara ini kita dapat memvalidasi model dengan mudah karena seseorang dapat mendorong sejumlah besar ukuran halaman untuk menyerang kinerja server. Dan jika mereka akan memberikan parameterless overload maka parameterless overload akan bisa digunakan saat model IPagedList. Tidak ada yang salah jika saya memberikan lebih banyak data daripada kebutuhan pembantu. Tidak ada aturan ketat seperti praktik terbaik.
Freshblood

0

Mengingat bahwa apa yang diminta klien untuk nomor halaman dan apa yang kemungkinan besar akan bervariasi oleh klien adalah ukuran halaman yang saya pikir:

public ActionResult MostPopulars(int pageIndex,int pageSize)

Merupakan cara yang cukup masuk akal untuk melakukan ini. Saya telah melihat variasi di mana ennum dari (pertama, berikutnya, prev, terakhir) digunakan tetapi benar-benar hanya cara canggung untuk mengatakan "pageIndex".

Saya akan menegaskan bahwa ukuran halaman akan dan harus sangat bervariasi, tergantung pada pemirsa yang terlibat Anda harus mendapatkan default yang berbeda untuk ponsel, portables dan workstation layar lebar, ditambah, dalam banyak kasus masuk akal untuk membiarkan pengguna akhir memilih berapa banyak item yang merupakan sebuah halaman.

Saya tahu ini menghasilkan banyak parameter yang lewat dalam kerangka kerja MVC, tetapi seluruh konsep paging memecah MVC - logika bisnis Anda perlu tahu tentang presentasi agar paging berfungsi sehingga selalu berantakan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.