2016-11-03 113 views
2

我有使用WCF服務的MVC項目。服務器端分頁MVC 6.0

當我顯示數據列表時,我確實希望從數據庫/服務加載所有內容並進行客戶端分頁。但我確實需要服務器端分頁。如果我有100條記錄,我的頁面大小爲10,那麼當用戶點擊頁面1時,它只會從數據庫中檢索前10條記錄,如果用戶點擊頁面3,則只會檢索相應的10條記錄。 我沒有使用Angular或任何其他引導程序。

有人可以指導我如何做到這一點?

public ActionResult Index(int pageNo = 1) 
    { 
     .. 
     .. 
     ..  

     MyViewModel[] myViewModelListArray = MyService.GetData();   

     //when I create this PageList, BLL.GetData have to retreive all the records to show more than a single page no. 
     //But if the BLL.GetData() was changed to retrieve a subset, then it only shows a single page no. 
     //what I wanted to do is, show the correct no of pages (if there are 50 records, and pageSize is 10, then show 
     //page 1,2,3,4,5 and only retrieve 10 records at a time. 
     PagedList<MyViewModel> pageList = new PagedList<<MyViewModel>(myViewModelListArray, pageNo, pageSizeListing); 
     .. 
     .. 
     .. 
     return View(pageList); 
    } 
+0

你可以發佈一些代碼告訴我們你試過了什麼,並且不工作嗎?要向大家展示您正在使用的是什麼類型的環境以及您正在使用的編碼風格,這將有很長的路要走。 –

+0

請顯示一些代碼。您也可以嘗試將啓動和限制傳遞給服務器,以便告訴服務器應該返回哪些特定記錄集。 – bogzy

+1

@bogzy如果我通過傳遞PageSize和PageNo來限制要返回的特定記錄集,那麼它只顯示一個頁面。 – user423415

回答

1

將參數頁面大小和頁碼添加到您的服務方法中,並將結果作爲返回TotalCount和List Items(Items是當前頁面上的項目)的對象。然後你可以使用這些值來創建PagedList。

在您的業務邏輯代碼中,您將針對項目的計數和頁面上的項目執行兩個查詢。

另外,如果您現在開始項目,請自己幫忙,並從體系結構中刪除無用的WCF服務。

+0

我爲PaedList中的TotalCount設置了哪些屬性? – user423415

+0

您不使用PagedList。如果你想使用渲染功能(html助手方法),你可以在你自己的類中實現這個接口 - https://github.com/troygoode/PagedList/blob/master/src/PagedList/IPagedList.cs – Stilgar

2

最好的方法是使用LINQ to Entities運算符跳過&拿。

例如,頁面

int items_per_page = 10; 
MyViewModel[] myViewModelListArray = MyService.GetData().OrderBy(p => p.ID).Skip((pageNo - 1) * items_per_page).Take(items_per_page).ToArray(); 

注:數據必須進行排序,使頁面有一定的一致性(但我沒有用一個任意域ID)。還有一些數據庫要求'order by'應用'limit'或'top'(這是Take/Skip的實現方式)。

我這樣說,因爲我不知道你是如何檢索數據。 但是取而代之的是使用GetData檢索完整列表,然後過濾掉,最好在GetData中的查詢中包含分頁(因此您不必檢索不必要的數據)。