2

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

有任何想法吗?

谢谢马尔科

4

4 回答 4

7

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

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

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

于 2010-08-17T15:47:05.597 回答
2

非常感谢 harlev...对于其他人也有一个提示,您可以将网格设置为在客户端上使用

数据类型:“客户端”

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

干杯

于 2009-08-27T16:35:54.627 回答
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。

于 2009-08-25T19:25:01.357 回答
0

对于那些@Groxx 的解决方案不起作用的人(当我尝试它时,每次我尝试对列进行排序时,我的网格内容都会消失),请尝试来自这个线程的解决方案。它对我有用。我正在使用 jqGrid 4.5.4。

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

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

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

于 2014-01-08T16:01:12.017 回答