【问题标题】:jqGrid loadonce doesn't work with asp.netjqGrid loadonce 不适用于 asp.net
【发布时间】:2010-11-22 16:11:58
【问题描述】:

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

有什么想法吗?

谢谢 马尔科

【问题讨论】:

    标签: asp.net jqgrid


    【解决方案1】:

    我最终放弃了 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。

    【讨论】:

    • 嗯,不错的提示 :) 我肯定会尝试 xml-way...thanx
    • 能否请您在使用 xml 时发布部分代码...thanx
    【解决方案2】:

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

    数据类型:'客户端'

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

    干杯

    【讨论】:

    • 是的,尽管 PDF 不是最新的,但它包含更多信息!
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢!我有数据类型作为函数。在 gridcomplete 设置 datatype:local 对我有用!
    • @Groxx:这对我有用,但仅适用于一栏:S。你会碰巧知道为什么吗?
    • @DavidS:它只对一列进行排序?不确定。不过,如果您提供更多信息,我可以稍微研究一下:它总是同一列吗?在同一个位置?其他人只是什么都不做,还是他们打服务器?还有其他可能相关的设置吗?什么版本?代码很乱,而且版本在奇怪的时候很重要。
    • @Groxx:始终是同一列,但我不知道您所说的相同位置是什么意思。其他人没有“真正”做任何事情。在我更改有效列的排序顺序并单击任何其他列后,排序将恢复到我第一次查看网格时的状态。我不确定相关设置可能是什么,因为我昨天刚开始使用 jqGrid。我使用的版本是4.1.1。
    • jqGrid 很痛苦 :) 它确实有效。我希望有更好的东西可以给你指点,但我不知道。至于相同的位置,我的意思是列位置 - 最左边,第三个,类似的东西。不过我现在明白了这个问题,下次有时间我会看看,然后告诉你我发现了什么。
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多