Разбивка на страницы на стороне сервера не работает для оболочки mvc сетки кендо на первой странице

Поскольку моя сетка кендо загружается слишком долго, если данные составляют более 15000 записей, я думаю о реализации пейджинга на стороне сервера.

Я не использую структуру сущности. Я использую оболочку Kendo MVC и хранимые процедуры SQL Server для извлечения и отображения данных.

Я передал процедуре два параметра как @Skip и @Take.

Ниже приведен мой код:

Просмотреть

@(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», представление загружается и данные отображаются успешно, НО НОМЕР СТРАНИЦЫ ПОКАЗЫВАЕТСЯ КАК 1 ТОЛЬКО в первый раз. В моей сетке также есть фильтры, как только я нажимаю на фильтр, метод «PageWiseData» вызывается снова, он извлекает 100 записей, и на этот раз показывает номер страницы для последующих страниц. Насколько я понимаю, во второй раз возвращаемые данные находятся в формате JSON, который также включает Total = 1500, но в первом случае, когда загружается частичное представление, этот счетчик «Total» не установлен.

Я не могу показать номера страниц (в моем случае должно быть до 15), когда частичное представление загружено и сетка привязана в первый раз

МОЖЕТ КТО-НИБУДЬ ПОМОЧЬ ЗДЕСЬ, КАК ПРОЙТИ СЧЕТ В ПЕРВЫЙ РАЗ или КАК ПРИВЯЗАТЬ СЕТКУ С МЕТОДОМ "PageWiseData" В ПЕРВЫЙ РАЗ.... ИЛИ любой другой способ сделать это... пожалуйста, помогите!!


person devgal    schedule 10.07.2015    source источник
comment
Ваш Action делает это неправильно, позвольте Кендо отфильтровать ваш результат, как объяснил @hutchonoid.   -  person Rosdi Kasim    schedule 10.07.2015
comment
я думаю, для этого я должен сначала вытащить все записи из БД, я прав??   -  person devgal    schedule 10.07.2015
comment
Нет, .ToDataSourceResult(request) применит к запросу собственный фильтр и разбиение на страницы, поэтому будут получены только необходимые записи.   -  person Rosdi Kasim    schedule 10.07.2015


Ответы (1)


Если вы применяете следующее, вам не нужно заботиться или беспокоиться о самостоятельной обработке пейджинга.

  • Вместо этого измените переменную totalResult на IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel>.
  • Измените метод DeviceEventsForExpandedView, удалите параметры Skip и Take, а также убедитесь, что он возвращает IQueryable<AMI.WebRole.Models.Widgets.DeviceEventModel>.

Если вы возвращаете IQueryable, Kendo должно применять сортировку и фильтрацию в БД, а не в памяти.

Также убедитесь, что вы используете .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);

}

Хорошая статья по теме:

Пейджинг, сортировка и фильтрация сервера с помощью Kendo DataSourceRequest

person hutchonoid    schedule 10.07.2015
comment
я думаю, для этого я должен сначала вытащить все записи из БД, я прав?? - person devgal; 10.07.2015
comment
@devgal Да, просто убедитесь, что он возвращает IQueryable, который отложен. :) - person hutchonoid; 10.07.2015
comment
но моя хранимая процедура занимает 42 секунды, если я вытащу все записи, если я пропущу и перейду к процедуре для 100 записей, это займет 13 секунд.... Я не хочу извлекать все записи из самой БД.... может это возможно?? - person devgal; 10.07.2015
comment
Он не потянет все записи. Кендо применит свой фильтр и разбиение на страницы к запросу, а ЗАТЕМ извлечет соответствующую запись. - person Rosdi Kasim; 10.07.2015
comment
@RosdiKasim Насколько я понимаю приведенный выше код, решение hutchonoid извлекает все записи и сохраняет их в переменной totalresults. После этого мы применяем фильтр через этот код, totalresults.ToDataSourceResult(request); - person devgal; 10.07.2015
comment
Если вы измените тип возвращаемого значения на IQueryable, как рекомендуется, запрос еще не будет выполнен. Google «запрашиваемая и исчисляемая производительность». - person Rosdi Kasim; 10.07.2015
comment
@hutchonoid у тебя есть решение?? я написал ServerOperation как true, так почему же он не использует второй метод при загрузке страницы ?? - person devgal; 10.07.2015
comment
@hutchonoid Также то, что я возвращаю во втором ActionResult как json, я сохранил то же самое в ViewBag ViewBag.CombineData = Json(new { Data = result, Total = 1200 });, в First ActionResult .. .но не удалось связать кендо из viewbag при загрузке страницы в jquery только в первый раз.. - person devgal; 10.07.2015
comment
@devgal Сетка настроена на ajax, я бы не советовал использовать ViewBag. - person hutchonoid; 10.07.2015
comment
@RosdiKasim я погуглил, я думаю, вы ПРАВЫ, он поддерживает позднее выполнение и переносит отфильтрованные данные с сервера, а не все на сторону клиента ... Позвольте мне попробовать ... ** НО до этого у меня есть озабоченность. Вызывается ли приведенный выше код автоматически в первый раз при загрузке частичного представления, если да, КАК??** - person devgal; 10.07.2015
comment
@hutchonoid Мне тоже нужно ваше внимание: впервые как будет вызываться приведенное выше кодовое решение сразу после загрузки частичного представления ?? - person devgal; 10.07.2015
comment
@devgal Kendo просто вызовет метод, указанный вами в разметке. - person hutchonoid; 10.07.2015
comment
@hutchonoid Так почему он не вызывался ранее в моем предыдущем НЕ РАБОТАЮЩЕМ коде, поскольку я и тогда указал его в разметке ?? Ответ на этот вопрос, несомненно, расширит мои знания...!! - person devgal; 10.07.2015
comment
@devgal Я думаю, может быть, потому что он не использует ожидаемый тип возврата, то есть использует ToDataSourceResult. - person hutchonoid; 10.07.2015