4

У меня есть MVC Kendo Grid следующим образом. Он отлично работает со стандартным поисковым вызовом.Пользовательский пейджинг для ASP.Net MVC Kendo Grid

Теперь я хочу выполнить пользовательский пейджинг. В действии контроллера нам нужно знать текущий индекс страницы. Также он должен установить «общий» счет для сетки. [Фактический источник данных будет иметь только 2 записи за раз, даже если в базе данных 100 записей. Таким образом, сетка должна знать общее количество записей в базе данных с использованием атрибута «total».]

Запрос должен возвращать только 2 записи из базы данных за раз.

Как мы можем выполнить этот настраиваемый подкастинг сервера с помощью оболочки MVC для Kendo Grid?

@using (Html.BeginForm()) 
{ 

    @(Html.Kendo().Grid<KendoUIMvcSample.Models.Sample>()  
    .Name("ssgrid222") 
    .Columns(columns => { 
     columns.Bound(p => p.SampleDescription).Filterable(false).Width(100); 
     columns.Bound(p => p.SampleCode).Filterable(false).Width(100); 
     columns.Bound(p => p.SampleItems).Filterable(false).Width(100); 
    }) 
    .AutoBind(false) 
    .Pageable() 
    .Sortable() 
    .Scrollable() 
    .Filterable() 
    .HtmlAttributes(new { style = "height:430px;" }) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .PageSize(2) 
     .Read(read => read.Action("Orders_Read", "Sample") 
) 
    ) 
) 
} 

Контроллер

public ActionResult Orders_Read([DataSourceRequest]DataSourceRequest request) 
     { 

      int currentPageNumber = request.Page; 
      return Json(GetOrders().ToDataSourceResult(request)); 
     } 
+0

Я думаю, если вы вернуть IQueryable, Кендо будет обрабатывать и сделать соответствующий запрос к базе данных. не запускайте запрос перед передачей данных в Kendo. –

ответ

8

Оно определено в kendo site

CONTROLLER КОД

//Paging and Sorting 
    int currentPage = request.Page; 
    int pageSize = request.PageSize; 
    string sortDirection = "ASC"; 
    string sortField = "UpdatedDateTime"; 

    if (request.Sorts != null && request.Sorts.Count > 0) 
    { 
     sortField = request.Sorts[0].Member; 
     sortDirection = request.Sorts[0].SortDirection.ToString(); 
    } 

//Setting the TOTAL 
var result = new DataSourceResult() 
{ 
    Data = orders, 
    Total = total // Total number of records 
}; 

return Json(result); 

VIEW

 <div class="GridSearch"> 

       @(Html.Kendo().Grid<MVC.Models.TransactionHistoryModel>() 
    .Name("TransactionHistroyGrid") 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .PageSize(25) 
     .ServerOperation(true) 
     .Read(read => read 
      .Action("TransactionHistorySearch_Read", "TransactionHistoryResults") 
      .Data("additionalData") 
      ) 
    ) 
    .Columns(columns => 
    { 
     columns.Bound(p => p.UserId).Filterable(false).Width(40).Title("Userid"); 
     columns.Bound(p => p.Reviewed).Template(@<text></text>).ClientTemplate("<input id='checkbox' class='chkbx' type='checkbox' />").Filterable(false).Width(30).Title("Reviewed"); 
     columns.Bound(p => p.CreatedOnEnd).Format("{0:MM/dd/yyyy}").Filterable(false).Width(50).Title("Created On"); 
     columns.Bound(p => p.UpdatedOnEnd).Format("{0:MM/dd/yyyy}").Filterable(false).Width(50).Title("Updated On"); 
     columns.Bound(p => p.Comment).Filterable(false).Width(50).Title("Comment"); 
    }) 
    .Pageable() 
    .Sortable() 
    .Scrollable() 
    .Filterable() 
    .HtmlAttributes(new { style = "height:325px;" }) 

) 
      </div> 
2

Здесь обычай пейджинговой решение мы реализовали для кэндо ListView. С небольшими изменениями он должен работать для сетки. Решение состоит из пользовательского объекта DataSoure и пользовательского класса JSonResult.

Источник пользовательские данные:

public class MyDataSource 
{ 
    public object AggregateResults { get; set; } 
    public object Data { get; set; } 
    public object Errors { get; set; } 
    public int Total { get; set; } 
} 

Обычай ActionResult:

public class JsonNetResult : ActionResult 
{ 
    public Encoding ContentEncoding { get; set; } 
    public string ContentType { get; set; } 
    public object Data { get; set; } 

    public JsonSerializerSettings SerializerSettings { get; set; } 
    public Formatting Formatting { get; set; } 

    public JsonNetResult() 
    { 
     SerializerSettings = new JsonSerializerSettings(); 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     HttpResponseBase response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(ContentType) 
            ? ContentType 
            : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     if (Data != null) 
     { 
      var writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 

      JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Serialize(writer, Data); 

      writer.Flush(); 
     } 
    } 

Типичное использование в способе действия будет:

public ActionResult Orders_Read([DataSourceRequest] Object request) 
    { 
     int count = 0; 
     var ds = (DataSourceRequest)request; 
     var ListOfItemsToDisplay = GetItemsWithPagingInfo 
           (
            MySearchParameters, 
            ds.PageSize, 
            ds.Page, 
            out count 
           ); 
     return new JsonNetResult 
           { 
            Formatting = Formatting.Indented, 
            Data = new MyDataSource 
                { 
                 Data = ListOfItemsToDisplay 
                 Total = count, 
                 AggregateResults = null, 
                 Errors = null 
                } 
            }; 
    }