Có một số hiểu lầm. Nếu bạn sử dụng datatype: local
thì bạn phải điền jqGrid chính mình bằng các phương thức như addRowData
hoặc đặt dữ liệu cùng một lúc với thông số data
(đối với jqGrid phiên bản 3.7 trở lên). Vì vậy, việc sử dụng datatype: local
theo jqGrid không tải bất kỳ dữ liệu nào và thông số datatype: processrequest
của bạn sẽ bị bỏ qua.
Nếu bạn muốn sử dụng loadonce: true
tham số được hỗ trợ kể từ phiên bản 3.7 của jqGrid, bạn nên có tất cả các thông số của jqGrid cho JSON hay XML (ví dụ datatype: json
trong trường hợp của bạn) và một tham số bổ sungloadonce: true
. Sau đó, sau khi tải dữ liệu đầu tiên jqGrid sẽ chuyển đổi kiểu dữ liệu thành datatype: local
và sau đó nó sẽ hoạt động độc lập trên máy chủ nhưng bỏ qua một số tham số (như datatype: processrequest
trong trường hợp của bạn).
Một nhận xét nhỏ hơn nữa. Hầu hết các thuộc tính của jsonReader
mà bạn sử dụng trong ví dụ của mình là mặc định (xem this wiki). Các thông số mà bạn sử dụng sẽ được kết hợp với các thuộc tính mặc định, vì vậy nó là đủ để sử dụng tham số như jsonReader: { repeatitems: false, id: "ID"}
CẬP NHẬT: OK Jeff. Dường như với tôi, để giải quyết vấn đề của bạn, bạn cần một số ví dụ mã hơn từ cả hai phía: máy khách và máy chủ. Dưới đây là một ví dụ nhỏ mà tôi đã tạo và thử nghiệm cho bạn.
Trước hết phía máy chủ. Trong dịch vụ web ASMX chúng ta định nghĩa một phương pháp web mà tạo ra một dữ liệu thử nghiệm cho bảng của bạn:
public JqGridData TestMethod() {
int count = 200;
List<TableRow> gridRows = new List<TableRow> (count);
for (int i = 0; i < count; 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 = 1,
page = 1,
records = gridRows.Count,
rows = gridRows
};
}
nơi lớp JqGridData
và TableRow
được định nghĩa như sau:
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; }
}
Ở đây bạn có thể thấy, các trang web phương thức TestMethod
không có tham số và bài đăng trả về dữ liệu đầy đủ. Phân trang, sắp xếp và tìm kiếm dữ liệu sẽ được thực hiện bởi jqGrid (phiên bản 3.7 hoặc cao hơn).
Để đọc dữ liệu đó và đưa vào jqGrid chúng ta có thể làm như sau:
$("#list").jqGrid({
url: './MyTestWS.asmx/TestMethod',
datatype: 'json',
mtype: 'POST',
loadonce: true,
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
serializeGridData: function (postData) {
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; }
},
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},
{},{},{},{multipleSearch : true});
Một số ý kiến về định nghĩa của jqGrid:
Để giao tiếp với dịch vụ web ASMX qua JSON người ta cần phải làm như sau trong yêu cầu jQuery.ajax
tương ứng:
dataType: 'json'
phải được đặt.
contentType:'application/json; charset=utf-8'
phải được đặt.
- dữ liệu gửi tới máy chủ phải được mã hóa JSON.
Để làm tất cả những điều này, tôi sử dụng các tham số datatype
, ajaxGridOptions
và serializeGridData
của jqGrid. Tôi mã hóa JSON với chức năng JSON.stringify
(có thể tải xuống JavaScript tương ứng từ here).
Sau đó, dữ liệu đã nhận phải được giải mã. Tôi làm điều này với tính năng yêu thích của tôi về jqGrid - jsonReader
với các chức năng (xem this SO post và this wiki).
Cuối cùng chúng tôi sử dụng loadonce: true
mà thay đổi datatype
của jqGrid 'json'
-'local'
và chúng tôi có thể sử dụng ngay lập tức tất cả các lợi thế của phân trang địa phương, sắp xếp và nâng cao tìm kiếm hiện kể từ jqGrid phiên bản 3.7.
Nếu bạn muốn thực hiện phân trang, phân loại và tìm kiếm trên máy chủ (hoặc tìm kiếm nâng cao) với dịch vụ web ASMX, bạn cũng có thể thực hiện. Để lưu một chỗ nhỏ ở đây và để tách các ví dụ mã, tôi sẽ đăng ví dụ tương ứng vào câu hỏi khác của bạn jqgrid Page 1 of x pager (xem phần CẬP NHẬT).
Tôi đã cập nhật câu lệnh jsonReader của mình như bạn đã đề xuất và tôi đã xóa dòng setGridParam. Tôi giữ giá trị loadonce nhưng tôi vẫn thấy rằng nó quay trở lại máy chủ mỗi lần. Nó dường như không hoạt động. Bất kỳ đề xuất nào khác? – webdad3