jqgrid第1页的x pager

时间:2010-07-01 20:09:12

标签: asp.net jqgrid web-services jqgrid-asp.net

我试图弄清楚如何使用jqGrid的分页功能。 目前我被困在第1页的第4页。无论我是否按下“下一步”按钮。它只停留在1。

我正在使用带有Web服务的ASP.Net来填充我的JSON数据。如何从客户端捕获事件以填充Web服务上的属性以恢复正确的值?

感谢任何帮助。

2 个答案:

答案 0 :(得分:17)

如果按“下一步”按钮,将向服务器发送新请求。该请求将包含page=2,例如,rows=10参数作为URL的一部分(如果想要获取第二页的下一行10行)。

您的服务器代码应读取此参数并发回相应的数据行。从服务器发回的JSON数据应如下所示

{ 
  "total": "5", 
  "page": "2", 
  "records": "55",
  "rows" : [
    {"id" :"21", "cell" :["cell11", "cell12", "cell13"]},
    {"id" :"22", "cell" :["cell21", "cell22", "cell23"]},
      ...
    {"id" :"30", "cell" :["cell31", "cell32", "cell33"]},
  ]
}

(见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data)。因此,数据必须包含page(页面= 2)的正确值。通常情况下,现在您可以像以前一样拥有更少的数据,并在请求中返回页码1以获取页码2.

所以我建议您当前的服务器代码不会在输出中返回正确的page值。

更新:好的杰夫。我在jqgrid setGridParam datatype:local继续我的回答并发布如何承诺代码如何进行服务器端分页,排序和搜索(或高级搜索)。

首先,在示例中,我不会真正实现排序和搜索,只会模拟您现在遇到问题的分页。真正的分页,排序和搜索应该作为数据存在的SQL数据库的相应SELECT语句来实现。排序遵循ORDER BY,搜索WHERE并分页到TOP(x)TOP(x)LEFT OUTER JOINROW_NUMBER() OVER(...)构造使用的结构。但这些都不是你问题的主题。所以我将所有内容简化为数据分页的简单模拟。

我从ASMX Web方法的代码开始:

public JqGridData TestMethod (int page, int rows, string sidx, string sord,
    bool _search, string searchField, string searchOper, string searchString) {
    // for advance search use "string filters" instead of the last three parameters
    int recordsCount = 205;

    int startIndex = (page - 1) * rows;
    int endIndex = (startIndex + rows < recordsCount) ?
                   startIndex + rows : recordsCount; 
    List<TableRow> gridRows = new List<TableRow> (rows);
    for (int i = startIndex; i < endIndex; i++) {
        gridRows.Add (new TableRow () {
            id = i,
            cell = new List<string> (2) {
                string.Format("Name{0}", i), 
                string.Format("Title{0}", i)
            }
        });
    }

    return new JqGridData () {
        total = (recordsCount + rows - 1) / rows,
        page = page,
        records = recordsCount,
        rows = gridRows
    };
}

其中类JqGridDataTableRow的定义如下:

public class TableRow {
    public int id { get; set; }
    public List<string> cell { get; set; }
}
public class JqGridData {
    public int total { get; set; }
    public int page { get; set; }
    public int records { get; set; }
    public List<TableRow> rows { get; set; }
}

我们跳过对TestMethod的输入参数的任何验证,以使代码示例更具可读性。

现在客户端代码:

$("#list").jqGrid({
    url: './MyTestWS.asmx/TestMethod',
    datatype: 'json',
    mtype: 'POST',
    ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
    serializeGridData: function (postData) {
        if (postData.searchField === undefined) postData.searchField = null;
        if (postData.searchString === undefined) postData.searchString = null;
        if (postData.searchOper === undefined) postData.searchOper = null;
        //if (postData.filters === undefined) postData.filters = null;
        return JSON.stringify(postData);
    },
    jsonReader: {
        root: function (obj) { return obj.d.rows; },
        page: function (obj) { return obj.d.page; },
        total: function (obj) { return obj.d.total; },
        records: function (obj) { return obj.d.records; }
    },
    // you can also use following more simple form of jsonReader instead:
    // jsonReader: { root: "d.rows", page: "d.page", total: "d.total",
    //               records: "d.records", id: "d.names" }
    colModel: [
        { name: 'name', label: 'Name', width: 250 },
        { name: 'title', label: 'Title', width: 250 }
    ],
    rowNum: 10,
    rowList: [10, 20, 300],
    sortname: 'name',
    sortorder: "asc",
    pager: "#pager",
    viewrecords: true,
    gridview: true,
    rownumbers: true,
    height: 250,
    caption: 'My first grid'
}).jqGrid('navGrid', '#pager', {edit: false, add: false, del: false, search: true});
//                {}, // use default settings for edit
//                {}, // use default settings for add
//                {}, // delete instead that del:false we need this
//                {multipleSearch : true} // enable the advanced searching
//                );

在代码中,我使用与jqgrid setGridParam datatype:local相同的技术,但serializeGridData函数的代码略有不同。因为我们使用POST而不是GET方法从服务器获取数据必须始终设置Web方法的所有输入参数。另一方面,jqGrid并不总是设置参数searchFieldsearchOpersearchString,但仅限于_search=true。例如,在第一次加载jqGrid时,_search=falsesearchFieldsearchOpersearchString未在postData中定义。为解决此问题,我们使用null初始化未定义的参数。

要实现排序,需要使用sidx(排序索引)和sord(排序方向:"asc""desc")参数。

要实现搜索,您需要使用其他参数_searchsearchFieldsearchOpersearchString

在高级搜索而不是searchFieldsearchOpersearchString参数期间,必须使用参数filters(请参阅注释行)。必须根据JSON解串器对数据进行解码。所以必须在jqgrid中设置multipleSearch : trueserializeGridData函数应替换为

serializeGridData: function (postData) {
    if (postData.filters === undefined) postData.filters = null;
    return JSON.stringify(postData);
}

并且Web方法的原型应该更改为

public JqGridData TestMethod (int page, int rows, string sidx, string sord,
    bool _search, string filters)

解码参数filters可以使用这样简单的代码:

if (_search && !String.IsNullOrEmpty (filters)) {
    JavaScriptSerializer serializer = new JavaScriptSerializer ();
    jqGridSearchFilter searchFilter =
        serializer.Deserialize<jqGridSearchFilter> (filters);
    // use the searchFilter here
}

可以定义类jqGridSearchFilter,如下所示:

public class jqGridSearchFilterItem {
    public string field { get; set; }
    public string op { get; set; }
    public string data { get; set; }
}
public class jqGridSearchFilter {
    public string groupOp { get; set; }
    public List<jqGridSearchFilterItem> rules { get; set; }
}

我希望这些信息足以让您实现ASMX Web方法的任何类型的jqGrid用法。

我在这里使用了从服务器发送到客户端的最简单数据,主数据之外还有id。如果表中的其中一列是id,则可以稍微减少发送到服务器的数据。有关详细信息,请参阅Jqgrid 3.7 does not show rows in internet explorer

答案 1 :(得分:0)

好的,我正在回答这个问题,因为我接受了Oleg上面所说的,但确切地想出了他的意思。

我的.ajax调用包含在一个传递postdata作为参数的函数中。我找不到关于该参数的任何文档,但我想也许这就是包含页面值的地方。正如你所看到的那样,我使用postdata.page做了一个警告,并且低了,看到我得到了一个值(基于点击下一个按钮)。

所以我在我的webservice中创建了一个名为page(integer)的参数。

正如旁注,您将jQuery中的整数值传递给ASP.Net webservice,如下所示:

data: "{'page':'" + postdata.page + "'}"

以下是完整功能:

function processrequest(postdata) {
alert(postdata.page);
$(".loading").show();
$.ajax({
    type: "POST",
    data: "{'page':'" + postdata.page + "'}",
    datatype: "json",
    url: "../webServices/myTestWS.asmx/testMethod",
    contentType: "application/json; charset-utf-8",
    complete: function (jsondata, stat) {
        if (stat == "success") {
            var thegrid = jQuery("#list")[0];
            var jsonObject = (eval("(" + jsondata.responseText + ")"));
            thegrid.addJSONData(jsonObject.d);
            $(".loading").hide();
        } else {
            $(".loading").hide();
            alert("Error with AJAX callback");
        }
    }
});

}