jqGrid loadonce不';不能使用asp.net

jqGrid loadonce不';不能使用asp.net,asp.net,jqgrid,Asp.net,Jqgrid,有人知道如何用asp.net+asmx+jqGrid排序解决这个棘手的问题吗。 因为,为了从jqGrid调用pagemethods或asmx web服务,需要对其进行如下黑客攻击: datatype: function() { $.ajax({ url: 'Default.aspx/GetPersons', data: "{}",

有人知道如何用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会为网格中发生的每个事件调用服务器

有什么想法吗

塔克斯
Marko

我最终放弃了JSON(使用ASP.NET),只使用XML。然后一切都正常了。 确保asmx的返回类型为XmlDocument

你需要做的每件事的一个好的总结(至少在客户端)可以在

查看他们的示例XML,确保您的服务返回的缓冲区(最好使用)遵循相同的模式

更新-一些代码示例

下面是创建网格的客户端脚本

     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):

公共函数getCallsGridDataXML()作为XmlDocument Dim xmlRet作为新的XmlDocument Dim ret作为新的StringBuilder m_pageNum=CInt(HttpContext.Current.Request.Form.Item(“页面”)) 如果m_pageNum=Nothing或LSE m_pageNum=0,则 m_pageNum=1 如果结束 m_pageSize=CInt(HttpContext.Current.Request.Form.Item(“行”)) 如果m_pageSize=Nothing或LSE m_pageSize=0,则 m_pageSize=10 如果结束 m_sortItem=CStr(HttpContext.Current.Request.Form.Item(“sidx”)) m_sortOrder=CStr(HttpContext.Current.Request.Form.Item(“sord”)) 作为数据表的Dim dt dt=会话(会话调用网格数据) 将myView调整为DataView=dt.DefaultView 如果m_sortItem不是什么,m_sortOrder也不是什么,那么 myView.Sort=m_sortItem&&m_sortOrder 如果结束 ret.Append(“”) ret.Append(“”) ret.Append(“&m_pageNum&”) ret.Append(“&Math.Floor(dt.Rows.Count/m_pageSize)&”) ret.Append(“&dt.Rows.Count&”) 对于i作为整数=(m_pageNum-1)*m_pageSize到Math.Min(dt.Rows.Count-1,m_pageNum*m_pageSize-1) ret.Append(“”) Dim cellCount为整数=0 ret.Append(“&Server.HtmlEncode(myView(i)(“callId”)&”) ret.Append(“&Server.HtmlEncode(myView(i)(“callTime”)&”) ret.Append(“&Server.HtmlEncode(myView(i)(“duration”)&”) ret.Append(“”) 下一个 ret.Append(“”) LoadXml(ret.ToString) 返回xmlRet 端函数
您可以看到,我正在将XML构建为字符串,然后将其加载到XMLDocumennt中。我不能说我知道这是最好的方法。您可以直接在文档上构建XML DOM。

Thanx很多,harlev…还有一个技巧,您可以将网格设置为在客户机上使用

数据类型:“客户端”

属性。起初我没有找到它,因为它没有列在在线文档中,但它是pdf文档,您可以从中下载


干杯

虽然有点晚了,但对于任何未来的解决方案寻求者来说,这里有一个超级简单的解决方案:

gridComplete: function(){ 
  $("#yourGridID").setGridParam({datatype: 'local'}); 
}

就这样。我使用的是3.7.2,不能代表任何其他版本。问题(显然)源于“loadonce”只处理预定义的数据类型值,而函数不是。我相信其他内置值也会起作用,但“本地”是有意义的。

对于那些@Groxx的解决方案不起作用的人(当我尝试它时,我的网格内容在每次尝试对列排序时都会消失),请尝试从中选择解决方案。这对我有用。我使用的是jqGrid 4.5.4

首先,在网格设置中设置
loadonce:true
。如上所述,这会在网格第一次完成加载后将数据类型参数更改为“本地”。然后,当您想要重新加载网格时,将数据类型更改回
json

$('#your-grid').setGridParam({ datatype : 'json' }).trigger('reloadGrid');

如果您使用的是
navGrid
,您可能需要查看您的添加、编辑和删除选项,以强制重新加载网格,如中所示。

hmm,很好的提示:)我肯定会尝试xml方式。。。Thanx当您使用xml时,请发布部分代码…thanxyes,即使PDF不是最新的,但它有更多的信息!谢谢我将数据类型作为一个函数。在gridcomplete上设置datatype:local对我来说很有用@Groxx:这对我来说很有效,但只适用于一个专栏:S。你知道为什么吗?@DavidS:它只适用于一个专栏?不确定。不过,如果你能提供更多的信息,我可以稍微研究一下:它总是同一列吗?处于相同的位置?其他人是什么都不做,还是他们攻击了服务器?是否有其他可能相关的设置?什么版本?代码很混乱,版本在奇怪的时候很重要。@Groxx:它总是同一列,但我不知道你说的同一位置是什么意思。其他人“真的”什么都不做。更改有效列的排序顺序并单击任何其他列后,排序将恢复到第一次查看网格时的状态。我不确定相关设置可能是什么,因为我昨天才开始使用jqGrid。我使用的版本是4.1.1.jqGrid是一个痛苦的版本:)但它确实可以工作。我希望有更好的东西可以给你指点,但我不知道。至于相同的位置,我指的是列的位置-最左边,第三,类似的。我现在明白了这个问题,下次有时间我会看一眼,然后告诉你我发现了什么。
$('#your-grid').setGridParam({ datatype : 'json' }).trigger('reloadGrid');