2015-07-10 39 views
2

正如我的劍道電網花費太多時間,如果數據是超過15000個 記錄加載,我想實現服務器端分頁的。服務器端分頁不工作的第一頁劍道電網MVC包裝

我沒有使用實體框架。我正在使用Kendo MVC包裝器和SQL服務器存儲過程來提取和顯示數據。

我已將@Skip和@Take的兩個參數傳遞給Procedure。

以下是我的代碼:

查看

@(Html.Kendo().Grid(Model) 
    .Name("expandedView_" + Model.ToArray()[0].WidgetId.ToString()) 
    .Columns(columns => 
    { 
     columns.Bound(p => p.FacilityNameAbbreviation).Title(@Resource.FacilityName).Width("15%"); 
     columns.Bound(p => p.DeviceAbbreviation).Title(@Resource.DeviceName).Width("10%"); 
     columns.Bound(p => p.EventType).Title(@Resource.EventType).Width("40%"); 
     columns.Bound(p => p.SubEventCode).Title(@Resource.SubAlarmCode).Width("10%").HtmlAttributes(new { style = "text-align:right" }); 
     columns.Bound(p => p.FacilityEventTime).Title(@Resource.EventTime).Width("15%"); 
     columns.Bound(p => p.EventStatus).Title(@Resource.Status).Width("10%"); 
     columns.Bound(p => p.PriorityColor).Hidden(true); 
    }) 
    .Scrollable() 
    .Pageable() 
    .DataSource(dt => dt 
    .Ajax() 
    .PageSize(100) 
    .Read(read => read.Action("PageWiseData", "DeviceEvent", new { WidgetId = Model.ToArray()[0].WidgetId, FacilityIds = ViewData["Facids"].ToString() })) 
    .ServerOperation(true) 
    .Model(model => model.Id(p => p.FacilityEventTime))) 
) 

操作:

[HandleError(ExceptionType = typeof(Exception), View = "ApplicationError")] 
public PartialViewResult DeviceEventExpandedView(int WidgetId, string FacilityIds) 
{ 
    var userDetail = sessionContext.UserContextBag; 

    int Skip = 0; // for first page data static value is passed 
    int Take = 100; 

    IList<AMI.WebRole.Models.Widgets.DeviceEventModel> result = _deviceEventClient.DeviceEventsForExpandedView(WidgetId, FacilityIds, TenantId, CustomerId, UserId, this.sessionContext.UserContextBag.CultureName, Skip, Take); 

    return PartialView(result); 
} 


public ActionResult PageWiseData(int WidgetId, string FacilityIds, [DataSourceRequest]DataSourceRequest request) 
{ 
    IList<AMI.WebRole.Models.Widgets.DeviceEventModel> Totalresult = null; 

    var Skip = (request.Page - 1) * request.PageSize; 
    var Take = request.PageSize; 

    Totalresult = _deviceEventClient.DeviceEventsForExpandedView(WidgetId, FacilityIds, TenantId, CustomerId, UserId, this.sessionContext.UserContextBag.CultureName, Skip, Take); 

    return Json(new 
     { 
      Data = Totalresult, 
      Total = 1500 
     }); 
} 

問題:

首次「DeviceEventExpandedView」被調用時,視圖被加載 和成功顯示的數據,但是頁號出現AS 1 ONLY首次。在我的網格中,過濾器也在那裏,一旦我點擊過濾器,方法「PageWiseData」被再次調用它拉100 記錄,這次是顯示後續頁面的頁碼。由於 我第二次理解,返回的數據是JSON,其中 也包含Total = 1500,但在第一種情況下,當部分視圖是 加載時,此計數「Total」未設置。

我無法顯示的頁面數(應該是高達15在我的情況)時,局部視圖加載和網格是綁定的第 時間

任何一個可以幫助在這裏,怎麼第一次通過計數或如何 第一次使用方法「PageWiseData」綁定網格....或任何 其他方式來做到這一點...請幫助!

+0

你'Action'是做錯了,讓劍道按照@hutchonoid的說明過濾結果。 –

+0

我想,爲此我必須先從數據庫中提取所有記錄,我是對嗎? – devgal

+0

不,''.ToDataSourceResult(request)'將自己的過濾器和分頁應用到查詢中,因此只會檢索所需的記錄。 –

回答

2

如果您應用下面的你不應該需要關心或擔心自己處理分頁。

  • 更改totalResult變量是一個IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel>代替
  • 更改DeviceEventsForExpandedView方法,去除SkipTake參數,並且確保如果返回IQueryable劍道應該應用排序它返回一個IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel>

並在數據庫而不是在內存中過濾。

還要確保您使用.ToDataSourceResult(request)如下返回結果:

public ActionResult PageWiseData(int WidgetId, string FacilityIds, [DataSourceRequest]DataSourceRequest request) 
{ 
    IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel> totalresult = null; 

    var totalresults = _deviceEventClient.DeviceEventsForExpandedView(WidgetId, 
      FacilityIds, TenantId, CustomerId, UserId, 
      this.sessionContext.UserContextBag.CultureName); 

     var results = totalresults.ToDataSourceResult(request); 
     return Json(results); 

} 

關於這個問題的好文章:

Server Paging, Sorting, and Filtering with Kendo DataSourceRequest

+0

我認爲,爲此,我必須先從數據庫中提取所有記錄,我是對嗎? – devgal

+0

@devgal是的,只要確保它返回延遲的IQueryable即可。 :) – hutchonoid

+0

但我的存儲過程需要42秒,如果我拉所有的記錄,如果我通過跳過並採取過程100個記錄需要13秒....我不想從數據庫本身拉所有記錄... 。可以嗎? – devgal