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(). Select, мне нужно отправить данные на сервер, которые я могу получить только путем обхода элементов 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