Jquery jqGrid-服务器端寻呼机
我被这个问题困扰着,非常感谢您的帮助。。。(奥列格,你在吗??) 我有一个jqgrid,它可以在服务器端进行排序和搜索,我知道需要在服务器上也进行分页,我找到了可以这样做的webService方法,但当我单击任何分页按钮时,都不会发生任何事情,调用也不会发送到服务器 有人能帮我看看我的代码有什么错误吗 我的代码是休耕:Jquery jqGrid-服务器端寻呼机,jquery,jqgrid,jqgrid-asp.net,pager,Jquery,Jqgrid,Jqgrid Asp.net,Pager,我被这个问题困扰着,非常感谢您的帮助。。。(奥列格,你在吗??) 我有一个jqgrid,它可以在服务器端进行排序和搜索,我知道需要在服务器上也进行分页,我找到了可以这样做的webService方法,但当我单击任何分页按钮时,都不会发生任何事情,调用也不会发送到服务器 有人能帮我看看我的代码有什么错误吗 我的代码是休耕: $(myGrid).jqGrid({ datatype: function (pdata) { Invoke("GetAll", pdata);
$(myGrid).jqGrid({
datatype: function (pdata) {
Invoke("GetAll", pdata);
},
colNames: columnNames,
colModel: columnModel,
jsonReader: {
root: "Result",
page: "page",
total: "total",
records: "records"
},
rowNum: 10,
//rowList: [5, 10, 20, 30],
pager: '#ViewNQueryPager',
viewrecords: true,
shrinkToFit: true,
loadtext: "Loading....",
emptyrecords: "No records to view",
viewrecords: true,
//scrollOffset: 0,
height: '300',
//width: '100%',
ignoreCase: true,
sortname: 'ID',
sortable: true,
sortorder: 'asc',
grouping: true,
groupingView: {
groupField: ['ID']
}
});
$(myGrid).jqGrid('navGrid', '#ViewNQueryPager', { del: false, add: false, edit: false }, {}, {}, {}, { multipleSearch: true, multipleGroup: true, showQuery: true, onSearch: function (response) { showQueryDetails(); } });
$(myGrid).jqGrid('filterToolbar', { stringResult: true, searchOnEnter: true });
$(myGrid).fluidGrid({ base: '#tableBox', offset: -20 });
function Invoke(action, pdata) {
var request = new Object();
if (pdata.filters == undefined && pdata._search == false)
request.Action = "Sort";
else {
if (pdata.filters != undefined && pdata._search == false)
request.Action = action;
else request.Action = "Filter";
}
if (pdata) {
request.SortIndex = pdata.sidx;
request.SortOrder = pdata.sord;
request.PageNumber = pdata.page;
request.PageSize = pdata.rows;
request._search = pdata._search;
request.filters = pdata.filters;
}
var cRequest = new Object();
cRequest.request = request;
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: 'WebService.asmx/Get',
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
dataType: "json",
data: JSON.stringify(cRequest),
success: function (xhrResponse, textStatus) {
var data = xhrResponse.d;
var table = $('#ViewNQueryTable');
table.clearGridData();
//table.total = data.total;
for (var i = 0; i < data.Result.length; i++) {
table.addRowData(i + 1, data.Result[i], 'last');
}
$('#totalRecordsFound').html(data.records + " Customers");
pdata.filters = undefined;
pdata._search = false;
},
error: function (data, textStatus) {
alert("Error fetching data");
}
});
}
但这没用
如何让分页按钮调用服务器方法
编辑
我的web方法是:
[WebMethod]
public kResponse Get(kRequest request)
{
if (count == 0)
{
CurrentList = JsonHelper.GetPersons();
count++;
}
var response = new kResponse();
switch (request.Action)
{
case "GetAll":
var result = new List<Person>();
var list = JsonHelper.GetPersons();
CurrentList = list;
response.records = CurrentList.Count;
response.total = response.records / request.PageSize;
//response.total = list.Count;
response.page = request.PageNumber;
for (int i = 0; i < 10; i++)
{
result.Add(list[i]);
}
//response.Result = result;
response.Result = list;
break;
case "Filter":
var filterParams = Filter.Create(request.filters);
List<Person> FilterdList = GetFilteredList(filterParams);
CurrentList = FilterdList;
response.Result = CurrentList;
response.records = CurrentList.Count();
response.total = response.records / request.PageSize;
//response.total = list.Count;
response.page = request.PageNumber;
break;
case "Sort":
//var listPersons = JsonHelper.GetPersons();
IQueryable<Person> SortedList = ApplySort(CurrentList.AsQueryable(), request.SortIndex, request.SortOrder);
CurrentList = SortedList.ToList();
response.Result = CurrentList;
response.records = CurrentList.Count();
response.total = response.records / request.PageSize;
//response.total = list.Count;
response.page = request.PageNumber;
break;
case "NextPage":
List<Person> allList = JsonHelper.GetPersons();
IQueryable<Person> NextPagelist = allList.AsQueryable();
NextPagelist = NextPagelist.Skip(request.PageNumber * request.PageSize).Take(request.PageSize).AsQueryable();
response.Result = NextPagelist;
response.records = NextPagelist.Count();
response.total = response.records / request.PageSize;
//response.total = list.Count;
response.page = request.PageNumber++;
break;
}
return response;
}
及
为了实现寻呼机,我尝试了以下方法:
$('#next_ViewNQueryPager').click(function () {
grid.Action = "NextPage";
triggerReloadGrid();
});
但我确信这不是一种方式。。。什么是???我看不出有任何额外的
操作
参数的要求。问题可能来自于对jqGrid在每个标准请求中从服务器请求哪些数据的误解。问题是排序、分页和过滤应该始终由web服务器进行分析和应用,并且所有“操作”都可以组合在一起
例如,您在网格中显示来自数据库的数据,其中有两列:产品名称和每个产品的单价。让我们按照产品名称对网格进行排序,作为初始jqGrid选项(sortname
是'ProductName'
),并使用rowNum
的默认值:20。在初始网格填充之后,用户设置过滤器以获得价格低于100美元的产品。在这种情况下,\u search
参数将设置为true
,而过滤器
将设置为过滤器以JSON格式编码的字符串(请参阅)。因此,web服务的web方法将使用以下参数调用:\u search=true
,filters=some value
,page=1
,rows=20
,sidx='ProductName'
和sord='asc'
。让我们看看最终的清单将是55种产品。因此,您将有3页结果,web服务必须返回与输入参数page=1
相对应的第一页。然后用户可以手动键入3作为页码并按Enter键,或者用户可以单击“价格”列的标题按价格对产品进行排序。在任何情况下,web方法都将接收新的请求,其中包含新值page
,行
,sidx
,sord
,\u search
参数以及可选的过滤器
参数
因此,服务器应该始终测试\u search
是否为true
。在这种情况下,服务器应将筛选器应用于获取所有产品的原始SQL查询。然后,结果必须始终按照sidx
和sord
参数中的值进行排序。最后,web服务器应计算过滤结果行的总数,并将其作为记录
输出参数的值返回。同样,web服务应该计算过滤页面的总数,并将其返回到total
输出参数中。最后,web服务应根据输入参数page
和行
的值返回最多行
记录(一页)
我试图解释说,您真的不需要定义“GetAll”、“Sort”、“Filter”、“NextPage”等操作,web服务应该始终考虑所有输入参数
顺便说一下,如果您想重命名并输入参数,可以使用
prmNames
(请参阅)。在中,我解释了如何直接使用datatype:'json'
而不是datatype
作为函数来实现对web服务的调用。您可以包括您使用哪个版本的jqGrid的web服务方法的签名吗?呼叫你有非常奇怪的参数,我真的不明白你为什么这么做。例如,方法名为Get
,您使用HTTPPOST。基于\u search
和filters
参数,在请求
参数中包括操作
属性,但仍将\u search
和filters
发送到服务器。您是否已经在服务器端实现了分页、排序和过滤,并且只在调用web方法时遇到问题?@Oleg,谢谢您的回答。我编辑了这个问题。我发送此操作是为了知道在Web服务中应该处理什么情况。我有种感觉我做错了什么,有没有办法解决这个问题?另外,分页、排序和筛选的实现还没有完成,它现在正在处理假数据。@Oleg,我再次编辑,感谢您的帮助,我真的需要它。.谢谢您,我将去掉操作
参数。我现在明白了它的工作原理。但是,即使rowNum:10
和总记录数为25,它也不会将其分为两页,为什么会这样?您还可以告诉我如何在服务器上实现这些功能吗?@Ovi:我想您的服务器在total
或可能是records
输出参数中放置了错误的值。此外,它可以更多地作为10
行放置在响应中。您应该在返回响应上设置断点
语句,并严格检查响应
输出的所有属性。@Oli:我已经发布了。服务器代码的确切实现取决于访问数据库所使用的技术:例如,实体框架、LINQ到SQL或SqlDataReader
。在使用EF的情况下,您可以从中获得所需的代码。MVC部分完全独立于使用排序、分页和过滤的部分。您只需下载演示并结合两个演示中需要的内容即可。@ShamseerKSmr:“标准”运算符已定义。我开发的[free jqGrid]()fork允许定义自定义searc
public class kRequest
public string Action { get; set; }
public int PageSize { get; set; }
public int PageNumber { get; set; }
public string SortIndex { get; set; }
public string SortOrder { get; set; }
public string Search { get; set; }
public bool _search { get; set; }
public string filters { get; set; }
public class kResponse
//public int Total { get; set; }
public object Result { get; set; }
public int page { get; set; }
public int total { get; set; }
public int records { get; set; }
//public GridRow[] rows { get; set; }
$('#next_ViewNQueryPager').click(function () {
grid.Action = "NextPage";
triggerReloadGrid();
});