有谁知道如何用asp.net + asmx + jqGrid排序来解决这个令人讨厌的问题。 因为,为了从jqGrid调用pagemethods或asmx web服务,它需要像这样被黑客攻击:
datatype: function() {
$.ajax({
url: 'Default.aspx/GetPersons',
data: "{}",
type: "POST",
dataFilter: function(data) {
var msg = eval('(' + data + ')');
if (msg.hasOwnProperty('d'))
return msg.d;
else
return msg;
}
而不是:
datatype: "json"
因此,为了在客户端上进行排序,将loadonce属性设置为true不起作用,jqGrid会为网格中发生的每个事件调用服务器。
有什么想法吗?
感谢名单 马尔科
答案 0 :(得分:7)
这有点晚了,但对于未来寻求解决方案的人来说,这是一个超级简单的解决方案:
gridComplete: function(){
$("#yourGridID").setGridParam({datatype: 'local'});
}
就是这样。我正在使用3.7.2,不能代表任何其他版本。问题(显然)源于'loadonce'仅使用预定义的数据类型值,而函数则不然。我相信其他内置值也会起作用,但“本地”是有意义的。
答案 1 :(得分:2)
我最终放弃了JSON(使用ASP.NET)并且只使用了XML。一切正常。 确保asmx的返回类型是XmlDocument
可以在JQGrid wiki
上找到您需要做的所有事情的总结(至少在客户端)查看他们的示例XML并确保您的服务返回一个缓冲区(最好用Fiddler进行验证),该缓冲区遵循相同的模式。
更新 - 一些代码示例
以下是创建网格的客户端脚本
var mygrid = $("#list").jqGrid({
url: '../../webServices/callsGridService.asmx/getCallsGridDataXML?nd=' + new Date().getTime(),
datatype: 'xml',
mtype: 'POST',
contentType: "text/xml",
colNames: ['Call ID', 'Date / Time', 'Duration'],
colModel: [
{ name: 'callId', index: 'callId', align: "right", key: true },
{ name: 'callTime', index: 'callTime', sorttype: 'date' },
{ name: 'duration', index: 'duration', align: "right" }
],
pager: $('#pager'),
rowNum: 10,
rowList: [10, 25, 50, 100],
sortname: 'callTime',
viewrecords: true,
sortorder: "desc",
height: "100%",
multiselect: true,
rownumbers: true,
gridview: true,
autowidth: true,
caption: "Calls"
})
这是服务代码(VB.NET):
Public Function getCallsGridDataXML() As XmlDocument
Dim xmlRet As New XmlDocument
Dim ret As New StringBuilder
m_pageNum = CInt(HttpContext.Current.Request.Form.Item("page"))
If m_pageNum = Nothing OrElse m_pageNum = 0 Then
m_pageNum = 1
End If
m_pageSize = CInt(HttpContext.Current.Request.Form.Item("rows"))
If m_pageSize = Nothing OrElse m_pageSize = 0 Then
m_pageSize = 10
End If
m_sortItem = CStr(HttpContext.Current.Request.Form.Item("sidx"))
m_sortOrder = CStr(HttpContext.Current.Request.Form.Item("sord"))
Dim dt As DataTable
dt = Session(SESSION_CALLS_GRID_DATA)
Dim myView As DataView = dt.DefaultView
If m_sortItem IsNot Nothing AndAlso m_sortOrder IsNot Nothing Then
myView.Sort = m_sortItem & " " & m_sortOrder
End If
ret.Append("<?xml version='1.0' encoding='utf-8'?>")
ret.Append("<rows>")
ret.Append("<page>" & m_pageNum & "</page>")
ret.Append("<total>" & Math.Floor(dt.Rows.Count / m_pageSize) & "</total>")
ret.Append("<records>" & dt.Rows.Count & "</records>")
For i As Integer = (m_pageNum - 1) * m_pageSize To Math.Min(dt.Rows.Count - 1, m_pageNum * m_pageSize - 1)
ret.Append("<row>")
Dim cellCount As Integer = 0
ret.Append("<cell>" & Server.HtmlEncode(myView(i)("callId")) & "</cell>")
ret.Append("<cell>" & Server.HtmlEncode(myView(i)("callTime")) & "</cell>")
ret.Append("<cell>" & Server.HtmlEncode(myView(i)("duration")) & "</cell>")
ret.Append("</row>")
Next
ret.Append("</rows>")
xmlRet.LoadXml(ret.ToString)
Return xmlRet
End Function
您可以看到我将XML构建为字符串,然后将其加载到XMLDocumennt中。我不能说我知道这是最好的方式。您可以直接在文档上构建XML DOM。
答案 2 :(得分:2)
Thanx很多harlev ...也为其他人提示,你可以设置网格在客户端工作
数据类型:'clientside'
属性。我一开始并没有找到它,因为它没有在在线文档中列出,但它是在pdf文档中,您可以从here下载。
干杯
答案 3 :(得分:0)
对于那些@ Groxx的解决方案不起作用的人(当我尝试它时,每当我尝试对列进行排序时,我的网格内容都消失了),请尝试this thread的解决方案。它对我有用。我正在使用jqGrid 4.5.4。
首先,在网格设置中设置loadonce : true
。正如here所解释的那样,这在第一次加载网格后将数据类型参数更改为“local”。然后,当您要重新加载网格时,将数据类型更改回json
:
$('#your-grid').setGridParam({ datatype : 'json' }).trigger('reloadGrid');
如果您使用的是navGrid
,则可能需要查看添加,修改和删除选项,以强制您的网格重新加载,如this answer中所示。