Well, I just solved my problem like this :
For paging : add new parameter for each action called 'type' and validate based on the parameter.
public ActionResult Formations(GridSortOptions sort, int? page, string type, string filter = "all") { if (type != null && !type.Equals("Formation")) page = 1; IPagination<StratUnitVo> pagination = ...... return PartialView("_Formations", pagination); }
For sorting : use ajax sort for mvc grid :
$(function () { ajaxSort('pools', 'Stratigraphy', 'Pools'); ajaxSort('formations', 'Stratigraphy', 'Formations'); ajaxSort('zones', 'Stratigraphy', 'Zones'); }); function ajaxSort(tableId, controllerName, actionName) { $(document).on('click', '#' + tableId + ' > table > thead > tr > th > a', (function () { // store the href attribute, will get the column and direction parameter var href = $(this).attr('href'); // mvc grid sort url is : 'http\\controllerName\\actionName?Column=columnname&Direction=[Ascending|Descending] var temp = href.split('&'); // retrieve the column name var column = temp[0].split('=')[1]; // retrieve sort direction var direction = temp[1].split('=')[1]; // retrieve column header var columnHeader = $(this).text(); // remove the href attribute, prevent postback $(this).removeAttr('href'); // use ajax to sort $.ajax({ url: '/' + controllerName + '/' + actionName, data: { 'Column': column, 'Direction': direction }, dataType: 'html', success: function (data) { $('#' + tableId).html(data); columnHeader = columnHeader.replace('\u25B2', '').replace('\u25BC', ''); // show up down arrow // \u25B2 and \u+25BC is the unicode character for up/down triangle (arrow) to display in HTML var column = $('#' + tableId + ' > table > thead > tr > th > a:contains(' + columnHeader + ')'); if(direction == 'Ascending') column.text(columnHeader + "\u25B2"); else { column.text(columnHeader + "\u25BC"); } }, }); })); }