jqGrid loadonce не работает с asp.net - PullRequest
2 голосов
/ 25 августа 2009

Кто-нибудь знает, как решить эту неприятную проблему с сортировкой asp.net + asmx + jqGrid? Потому что для вызова методов страницы или веб-сервисов asmx из jqGrid его необходимо взломать так:

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 вызывает сервер для каждого события, происходящего в сетке.

Есть идеи?

Thanx Marko

Ответы [ 4 ]

7 голосов
/ 17 августа 2010

Уже немного поздно, но вот (?) Супер-простое решение для любых будущих искателей решений:

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

Вот и все. Я использую 3.7.2, не могу говорить ни за какие другие версии. Проблема (по-видимому) проистекает из 'loadonce', работающего только с предопределенными значениями типа данных, а не функцией. Я верю и другие встроенные значения также будут работать, но «локальный» имеет смысл.

2 голосов
/ 27 августа 2009

Огромное спасибо ... и для других один совет: вы можете настроить grid для работы на клиенте с помощью

тип данных: "клиентская сторона"

атрибут. Сначала я его не нашел, потому что его нет в онлайн-документации, но он есть в pdf-документации, которую вы можете скачать здесь .

Приветствия

2 голосов
/ 25 августа 2009

В конце концов я отказался от 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 непосредственно на документе.

0 голосов
/ 08 января 2014

Для тех, для кого решение @ Groxx не сработало (когда я пробовал его, содержимое моей сетки исчезало при каждой попытке отсортировать столбец), попробуйте решение из этой темы . Это сработало для меня. Я использую jqGrid 4.5.4.

Во-первых, установите loadonce : true в настройках вашей сетки. Как объяснено здесь , это изменяет параметры типа данных на 'local' после того, как сетки завершают загрузку в первый раз. Затем, когда вы хотите перезагрузить сетку, измените тип данных обратно на json:

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

Если вы используете navGrid, возможно, вы захотите просмотреть параметры добавления, редактирования и удаления, чтобы заставить вашу сетку перезагрузиться, как указано в в этом ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...