Telerik MVC Grid, Truly Ajax персонализирано обвързване

Използвам мрежа, която изглежда така:

 Html.Telerik().Grid(Model).Name("preciousGrid").
     ... bla bla bla..
     .ClientEvents(events => events.OnDataBinding("onDataBinding"))
     .Columns(columns =>
         {
           columns.Bound(o => o.Date);
           columns.Bound(o => o.Name);

Да, напълно игнорирам .DataBinding неща, за да използвам персонализирано ajax повикване. Защо? Трябва да изпратя на сървъра повече данни, вместо обикновен идентификатор. И единственият начин да се съберат тези данни е чрез преминаване през DOM елементи. Така че нито един от методите, предложени от Телерик, няма да работи в моя случай.

Всичко работи - в onDataBinding, след като необходимите данни са събрани и изпратени на сървъра, сървърът връща резултати, мрежата показва тези данни.

Но все пак има проблем. Пейджингът не работи. И долният колонтитул показва нещо подобно:

въведете описание на изображението тук

Някакви идеи?

UPD: О... може би трябва да изпратя на сървъра информация за пейджинг и да върна резултати въз основа на това? Как да стане това? Можете ли да ми покажете мостра?

UPD2: Командата GridCommand не изпраща информация за пейджинг към сървъра по подразбиране (ако я пропусна в $.ajax и все още поставя параметър GridCommand в метода на действие, тя ще изпрати нещо на контролера, но PageSize винаги е равен на 10 (по подразбиране стойност), а страницата винаги е 1. Така че предполагам, че трябва твърдо да включа тези стойности в $.ajax. Но не знам как мога да получа стойностите на PageSize и Page на клиента?


person iLemming    schedule 03.08.2011    source източник


Отговори (2)


Ако правите персонализирано обвързване на данни, трябва сами да се справите със странирането и сортирането, нещо подобно на показаното по-долу. Примерът на демонстрационния сайт е доста разумен...

[GridAction(EnableCustomBinding = true)]
public ActionResult _Index(GridCommand command)
{
    IEnumerable<MyObject> data = GetData(command.Page - 1, command.PageSize);
    int count = GetDataCount();
    return View(new GridModel { Data = data, Total = count });
}

в изгледа, който имате:

.DataBinding(dataBinding => dataBinding.Ajax().Select("_Index", "Subjects"))
.Pageable(p =>
{
    p.PageSize(Model.PageSize, Model.PageSizes);
    p.Style(GridPagerStyles.PageInput | GridPagerStyles.NextPreviousAndDropDown);
})
person Brett    schedule 03.08.2011
comment
Да.. Разбрах го... Трябваше само да добавя JsonRequestBehavior.AllowGet и вашият подход е правилен. Благодаря ти - person iLemming; 04.08.2011
comment
единственото нещо, което ме притеснява, че GridCommand изпраща PageSize винаги 10, дори ако го замените в маркирането - person iLemming; 04.08.2011
comment
Публикувах моя свързан изглед. Не съм сигурен защо обвързвате събитието ondatabound. Вижте метода .DataBinding() по-горе. - person Brett; 04.08.2011
comment
Брет, не мога да използвам Ajax(). Изберете, трябва да изпратя данни към сървъра, които мога да получа само чрез преминаване на DOM елементи! - person iLemming; 04.08.2011
comment
+ 1 Дяволът е в детайлите. Благодаря за отговора @Brett. Забравих да настроя EnableCustomBinding. - person Samuel; 09.11.2012

Добре... очевидно можете да направите наистина персонализирано обвързване на ajax

Трябва да дефинирате обвързване на данни, въпреки че то няма да се използва от мрежата, но ви е необходимо, за да можете да направите мрежата Странируема.

 .DataBinding(binding => binding.Ajax().Select("GetList","Home")) // Although I guess you can put whatever here
                        .ClientEvents(events => events.OnDataBinding("Grid_onDataBinding"))

След това във функцията Grid_onDataBinding javascript трябва да направите нещо подобно

var grid = $('#ConflictsGrid').data('tGrid');
$.ajax({ 
        url: "GetList",
        contentType: 'application/json; charset=utf-8',
        type: "GET",
        data: { 
               page: JSON.stringify({currentPage: grid.currentPage, pageSize: grid.pageSize }),
               // any other data you want to send to the server 
         },
         success: function (data) {
             grid.dataBind(data); // Here, the data that server returns will be actually bound to the grid
         },
person iLemming    schedule 04.08.2011