Telerik MVC Grid, пользовательская привязка Truly Ajax - PullRequest
2 голосов
/ 04 августа 2011

Я использую сетку, которая выглядит следующим образом:

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

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

Но все же есть проблема.Пейджинг не работает.И нижний колонтитул показывает что-то вроде этого:

enter image description here

Любые идеи?

UPD: О ... может быть, я должен отправить на сервер информацию о подкачке и вернуть результатына основании чего?Как это сделать?Можете ли вы показать мне пример?

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

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

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

[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);
})
2 голосов
/ 04 августа 2011

Хорошо ... очевидно, вы можете сделать действительно пользовательскую привязку 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
         },
...