Câu hỏi về thiết kế triển khai phân trang hiện tại


12

Tôi đã kiểm tra việc triển khai phân trang trên asp.net mvc một cách cụ thể và tôi thực sự cảm thấy rằng có một cái gì đó kém hiệu quả hơn trong việc triển khai.

Trước hết tất cả các triển khai sử dụng các giá trị phân trang như dưới đây.

public ActionResult MostPopulars(int pageIndex,int pageSize)
{

}

Điều mà tôi cảm thấy sai là pageIndex và pageSize hoàn toàn nên là thành viên của lớp Pagination nếu không cách này có vẻ rất nhiều chức năng. Ngoài ra, nó đơn giản hóa việc vượt qua paramater không cần thiết trong các tầng ứng dụng.

Điều thứ hai là họ sử dụng giao diện bên dưới.

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

Nếu tôi muốn định tuyến phân trang của mình sang hành động khác vì vậy tôi phải tạo mô hình khung nhìn mới để đóng gói tên hành động trong đó hoặc thậm chí tên của trình điều khiển. Một giải pháp khác có thể là gửi mô hình giao thoa này để xem sau đó chỉ định hành động và bộ điều khiển được mã hóa cứng trong phương thức máy nhắn tin làm tham số nhưng tôi đang mất hoàn toàn khả năng sử dụng lại quan điểm của mình vì nó hoàn toàn phụ thuộc vào chỉ một hành động.

Một điều nữa là họ sử dụng mã dưới đây trong chế độ xem

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

Nếu mô hình là IPagedList tại sao họ không cung cấp phương thức quá tải như @Html.Pager(Model)hoặc thậm chí tốt hơn phương thức @Html.Pager(). Bạn biết rằng chúng tôi biết loại mô hình theo cách này. Trước khi tôi làm sai vì tôi đang sử dụng Model.Page Index thay vì Model.PageNumber.

Một vấn đề lớn khác là họ mạnh mẽ dựa vào giao diện IQueryable. Làm thế nào họ biết rằng tôi sử dụng IQueryable trong lớp dữ liệu của mình? Tôi mong đợi rằng họ làm việc đơn giản với các bộ sưu tập giữ cho việc thực hiện phân trang không biết gì.

Điều gì sai về ý tưởng cải tiến của tôi đối với việc triển khai phân trang của họ? Lý do của họ để không thực hiện phân trang của họ theo cách này là gì?


Nó trông khá phức tạp với tôi. Không phải là tôi đã hiểu chính xác vấn đề là gì, nhưng ... bạn có thực sự cần sử dụng các trợ giúp tích hợp không? Tôi thậm chí không biết họ có một máy nhắn tin. Tôi đã phát triển một bộ sưu tập các trình trợ giúp của riêng mình kể từ thời MVC 1 Beta sau những lần thử đầu tiên (và không thành công) của tôi để hòa hợp với các trình trợ giúp tích hợp. Tôi khuyên bạn nên như vậy với bạn. Nếu bạn đang vật lộn với những người trợ giúp đó thì không tốt hơn WebForms nơi bạn đang vật lộn với các điều khiển máy chủ.

ASP.NET MVC không có trình trợ giúp phân trang được xây dựng, chỉ có các triển khai phân trang của bên thứ ba.
Freshblood

Cảm ơn bạn cho chút thông tin. Câu hỏi là, tại sao bạn cần một? Không có nỗ lực để tự thực hiện, giống như bạn muốn.

Tôi chỉ muốn biết rằng có điều gì đó sai về ý tưởng của tôi. Có phải tôi đã phá vỡ một số nguyên tắc cốt lõi nếu không phải vậy tại sao tất cả chúng đều theo cùng một thiết kế trên các triển khai của chúng .. tôi không hiểu được
Freshblood

Nếu một mã không thể giải quyết vấn đề của lập trình viên, mã không có giá trị, tốt nhất bạn nên tránh sử dụng nó.
Shaheer

Câu trả lời:


1

Như user8685 đã nêu: giao diện của bạn có vẻ dư thừa đối với các nguyên tắc và công cụ MVC hiện có.

Hãy thử điều này: thông tin bạn yêu cầu từ IPagedList, như chỉ mục trang, v.v. nên được triển khai trong lớp logic nghiệp vụ và được đưa đến chế độ xem / trang thông qua một mô hình chung có thể được đưa trở lại máy chủ và truyền và xử lý an toàn ở đó. Tại sao? Bởi vì những gì bạn đang thu thập ở đây rõ ràng là một đầu vào cho hệ thống thông tin của bạn và như vậy thuộc về các lớp thấp hơn UI.

Cách này có thể không phải là cách tốt nhất và chắc chắn không phải là cách nhanh nhất, nhưng sẽ giúp bạn dễ dàng nhìn thấy những gì bạn thực sự cần về sự trừu tượng và kiến ​​trúc dữ liệu và do đó giúp bạn loại bỏ sự dư thừa.

Ngoài ra, những người trợ giúp hiện tại thường chứa quá nhiều chi phí sử dụng đơn giản và đôi khi làm xáo trộn bức tranh lớn.


0

Không sử dụng IPagedList hoặc helper thingy này nhưng đây là của tôi:

Đây MostPopular(int pageIndex,int pageSize)là một giao diện rõ ràng: Tôi sẽ chỉ trả lại các trang của MostP phổ biến. Bạn nói rõ cho tôi biết trang nào và kích cỡ của nó.

Nếu họ đã thực hiện một phương thức điều khiển MostPopular(IPagedList<T> page), giao diện sẽ trở nên khó hiểu hơn. Bạn đang nói với bộ điều khiển tổng số lượng các mặt hàng hay không?

Khi bộ điều khiển truy xuất lát dữ liệu phân trang cụ thể của bạn, nó thường có thể khám phá nhiều dữ liệu khác, như tổng số có bao nhiêu mục. Tại thời điểm này, việc trả lại dữ liệu đó cho một khung nhìn là hợp lý, vì vậy nó có thể sử dụng có chọn lọc một số dữ liệu đó.

Điều này không có nghĩa là IPagedList là các mô hình, nó có thể cũng giống như cũng có một phần của một mô hình (một tài sản trên nó). Đây có thể là lý do tại sao không có quá tải tham số.

Họ có thể đã thêm IPagedList dưới dạng quá tải nhưng sau đó bạn sẽ chuyển một tập hợp (một đoạn dữ liệu được phân trang) cho một trình trợ giúp máy nhắn tin nhỏ không cần dữ liệu thực tế. Nó chỉ cần biết có bao nhiêu trang / mục và bạn đang ở đâu vào lúc này để nó có thể làm nổi bật số trang và như vậy. Bạn sẽ nói với người trợ giúp nhiều hơn nữa sau đó nó cần phải biết để thực hiện công việc của mình. Cách nó hoạt động bây giờ nó có khớp nối thấp hơn, đó là một điều tốt.


Tôi chỉ muốn nói tham số phương thức hành động có thể là đối tượng có thuộc tính có tên là Page Index và PageSize để theo cách này chúng ta có thể xác thực mô hình một cách dễ dàng vì ai đó có thể đẩy kích thước trang rất lớn để tấn công hiệu suất máy chủ. Và nếu chúng sẽ cung cấp quá tải không tham số thì quá tải không tham số sẽ có thể sử dụng được khi mô hình là IPagedList. Không có gì sai nếu tôi chuyển nhiều dữ liệu hơn thì người trợ giúp cần. Không có quy tắc nghiêm ngặt như thực hành tốt nhất.
Freshblood

0

Cho rằng những gì khách hàng yêu cầu về số trang và khách hàng có khả năng thay đổi nhiều nhất là kích thước trang tôi nghĩ:

public ActionResult MostPopulars(int pageIndex,int pageSize)

Là một cách khá hợp lý để làm điều này. Tôi đã thấy các biến thể trong đó một ennum của (đầu tiên, tiếp theo, trước, cuối cùng) đã được sử dụng nhưng thực sự nó chỉ là một cách khó xử để nói "page Index".

Tôi sẽ nhắc lại rằng kích thước trang sẽ và sẽ thay đổi rất nhiều, tùy thuộc vào người xem tham gia, bạn sẽ nhận được các giá trị mặc định khác nhau cho điện thoại di động, thiết bị di động và máy trạm màn hình lớn, trong nhiều trường hợp, có thể cho phép người dùng cuối chọn bao nhiêu mục. một trang.

Tôi biết điều này dẫn đến rất nhiều tham số truyền trong khung MVC, nhưng toàn bộ khái niệm phân trang phá vỡ MVC - logic kinh doanh của bạn cần biết về cách trình bày để phân trang hoạt động để nó luôn luôn lộn xộn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.