加载Telerik MVC网格状态

时间:2014-05-15 17:12:17

标签: jquery asp.net-mvc-4 telerik-grid telerik-mvc

我在保存/加载Telerik MVC网格控件的状态时遇到了一些问题。

我找到了许多使用Kendo网格的例子,但是我们没有权限将资源从原来的Telerik MVC网格更改为Kendo。

我能够保存&使用带有以下代码的Cookie加载网格的当前状态:

function setState() {
    var pricingGrid = $("#PricingGrid").data("tGrid");
    var dataSource = pricingGrid.dataSource;
    var state = JSON.stringify({
        page: pricingGrid.page,
        pageSize: pricingGrid.pageSize,
        sort: pricingGrid.orderBy,
        group: pricingGrid.groupBy,
        filter: pricingGrid.filterBy
    });

    $.cookie("pricingGridState", state);
}


function loadState() {
    var grid = $("#PricingGrid").data("tGrid");
    var state = JSON.parse($.cookie("pricingGridState"));
    if (state)
    {
        grid.sort(state.sort);
        grid.pageTo(state.page);
        grid.filter(state.filter);
    }
}

这段代码似乎可以解决问题,但它会为每个方法(sort,pageTo和filter)触发一个Rebind调用。我计划在页面上保存多个网格的状态,而不是让每个网格在页面加载时重新绑定3次。

在Kendo中,我似乎可以使用' grid.dataSource.query'方法,但我似乎无法在Telerik MVC中工作。

感谢任何帮助!

注意:我还尝试将state对象保存在grid.dataSource属性之外,但这些似乎根本不加载网格状态。

2 个答案:

答案 0 :(得分:1)

经过一番研究后,我找到了一个对我有用的解决方案。这是我做的:

//Prevent auto binding of grid and load state from cookie
var gridsToBind = [];    
function CommonGrid_onDataBinding(e) {
    if ($.inArray(e.target.id, gridsToBind) == -1) {
        e.preventDefault();
        gridsToBind.push(e.target.id);
        LoadGridState();
    }
}    
function LoadGridState() {
    var grid = $("#CommonGrid").data('tGrid');
    var state = $.cookie("gridState");
    if (state) {
        state = JSON.parse(state);
        grid.currentPage = state.currentPage;
        grid.orderBy = state.orderBy;
        grid.filterBy = state.filterBy;
        grid.pageSize = state.pageSize;
        for (var i in state.filteredCols) {
            if (state.filteredCols.hasOwnProperty(i)) {
                grid.columns[i].filters = state.filteredCols[i].filters;
                $("a[href*='=" + grid.columns[i].member + "-'").siblings(".t-grid-filter").addClass("t-active-filter");
            }
        }
        $("#CommonGrid").data('tGrid', grid);
    }
    grid.ajaxRequest();        
}

//Logic to save state of grid in cookie
function CommonGrid_OnDataBound(e) {
    var filteredCols = {};
    $.each(grid.columns, function (i, n) {
        if (!!n.filters) {
            filteredCols[i] = n;
        }
    });
    var state = JSON.stringify({
        currentPage: grid.currentPage,
        orderBy: grid.orderBy,
        filterBy: grid.filterBy,
        pageSize: grid.pageSize,
        filteredCols: filteredCols
    });
    $.cookie("gridState", state);
}

答案 1 :(得分:0)

我应用了之前的示例Sanjeev Rai:在使用

的Telerik Grid上使用时需要进行一些调整
.DataBinding(o =>
    {
        o.Ajax().Select(ajaxSelectActionName, controllerName);
    })

在这种情况下,grid.ajaxRequest();中的最后一行function LoadGridState()应该被评论以避免递归。 否则,解决方案非常优雅。 谢谢