web grid server pagination trigger multiple controller call when changing page

Posted by Thomas Scattolin on Stack Overflow See other posts from Stack Overflow or by Thomas Scattolin
Published on 2012-11-21T17:21:22Z Indexed on 2012/11/21 23:00 UTC
Read the original article Hit count: 462

Filed under:
|

When I server-filter on "au" my web grid and change page, multiple call to the controller are done :

  1. the first with 0 filtering,
  2. the second with "a" filtering,
  3. the third with "au" filtering.

My table load huge data so the first call is longer than others. I see the grid displaying firstly the third call result, then the second, and finally the first call (this order correspond to the response time of my controller due to filter parameter)

Why are all that controller call made ? Can't just my controller be called once with my total filter "au" ? What should I do ?

Here is my grid :

$("#" + gridId).kendoGrid({
            selectable: "row",
            pageable: true,
            filterable:true,
            scrollable : true,
            //scrollable: {
            //    virtual: true //false // Bug : Génère un affichage multiple...
            //},
            navigatable: true,
            groupable: true,
            sortable: {
                mode: "multiple", // enables multi-column sorting
                allowUnsort: true
            },
            dataSource: {
                type: "json",
                serverPaging: true,
                serverSorting: true,
                serverFiltering: true,
                serverGrouping:false, // Ne fonctionne pas...
                pageSize: '@ViewBag.Pagination',
                transport: {
                    read: {
                        url: Procvalue + "/LOV",
                        type: "POST",
                        dataType: "json",
                        contentType: "application/json; charset=utf-8"
                    },
                    parameterMap: function (options, type) {
                        // Mise à jour du format d'envoi des paramètres 
                        // pour qu'ils puissent être correctement interprétés côté serveur.
                        // Construction du paramètre sort : 
                        if (options.sort != null) {
                            var sort = options.sort;
                            var sort2 = "";
                            for (i = 0; i < sort.length; i++) {
                                sort2 = sort2 + sort[i].field + '-' + sort[i].dir + '~';
                            }
                            options.sort = sort2;
                        }
                        if (options.group != null) {
                            var group = options.group;
                            var group2 = "";
                            for (i = 0; i < group.length; i++) {
                                group2 = group2 + group[i].field + '-' + group[i].dir + '~';
                            }
                            options.group = group2;
                        }
                        if (options.filter != null) {
                            var filter = options.filter.filters;
                            var filter2 = "";
                            for (i = 0; i < filter.length; i++) {
                                // Vérification si type colonne == string.
                                // Parcours des colonnes pour trouver celle qui a le même nom de champ.
                                var type = "";
                                for (j = 0 ; j < colonnes.length ; j++) {
                                    if (colonnes[j].champ == filter[i].field) {
                                        type = colonnes[j].type;
                                        break;
                                    }
                                }

                                if (filter2.length == 0) {
                                    if (type == "string") { // Avec '' autour de la valeur.
                                        filter2 = filter2 + filter[i].field + '~' + filter[i].operator + "~'" + filter[i].value + "'";
                                    } else { // Sans '' autour de la valeur.
                                        filter2 = filter2 + filter[i].field + '~' + filter[i].operator + "~" + filter[i].value;
                                    }
                                } else {
                                    if (type == "string") { // Avec '' autour de la valeur.
                                        filter2 = filter2 + '~' + options.filter.logic + '~' + filter[i].field + '~' + filter[i].operator + "~'" + filter[i].value + "'";
                                    }else{
                                        filter2 = filter2 + '~' + options.filter.logic + '~' + filter[i].field + '~' + filter[i].operator + "~" + filter[i].value;
                                    }
                                }
                            }
                            options.filter = filter2;
                        }
                        var json = JSON.stringify(options);
                        return json;
                    }
                },
                schema: {
                    data: function (data) {
                        return eval(data.data.Data);
                    },
                    total: function (data) {
                        return eval(data.data.Total);
                    }
                },
                filter: {
                    logic: "or",
                    filters:filtre(valeur)
                }
            },
            columns: getColonnes(colonnes)
        });

Here is my controller :

[HttpPost]
    public ActionResult LOV([DataSourceRequest] DataSourceRequest request)
    {
        return Json(CProduitsManager.GetProduits().ToDataSourceResult(request));
    }

© Stack Overflow or respective owner

Related posts about grid

Related posts about kendo-ui