Каков наилучший способ оптимизировать мой JSON на сайте asp.net-MVC - PullRequest
3 голосов
/ 08 июня 2010

Я в настоящее время использую jqgrid на сайте asp.net mvc, и у нас довольно медленная сеть (внутреннее приложение), и кажется, что загрузка сетки занимает много времени (проблема как в сети, так и в разборе, рендеринг)

Я пытаюсь определить, как минимизировать то, что я посылаю клиенту, чтобы сделать это как можно быстрее.

Вот упрощенное представление действия моего контроллера для загрузки данных в сетку:

     [AcceptVerbs(HttpVerbs.Get)]
     public ActionResult GridData1(GridData args)
     {
        var paginatedData = applications.GridPaginate(args.page ?? 1, args.rows ?? 10,
        i => new
           {
       i.Id,
       Name = "<div class='showDescription' id= '" + i.id+ "'>" + i.Name + "</div>",
       MyValue = GetImageUrl(_map, i.value, "star"),
       ExternalId = string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>",
       Url.Action("Link", "Order", new { id = i.id }), i.Id),
              i.Target,
              i.Owner,
              EndDate = i.EndDate,
              Updated = "<div class='showView' aitId= '" + i.AitId + "'>" + GetImage(i.EndDateColumn, "star") + "</div>",
                                                      })

        return Json(paginatedData);
     }

Итак, я создаю данные json (у меня есть около 200 записей выше) и отправляю их обратно в графический интерфейс для добавления в jqgrid.

Единственное, что я могу сделать, это Повторные данные. В некоторых полях json я добавляю HTML поверх необработанных «данных». Это один и тот же HTML в каждой записи. Кажется, было бы более эффективно, если бы я мог просто отправить данные и «добавить» HTML-код вокруг него на стороне клиента. Это возможно? Тогда я бы просто отправлял фактические данные по проводам, и чтобы клиентская сторона добавляла остальные HTML-теги (div и т. Д.), Которые собирались вместе.

Кроме того, если есть какие-либо другие предложения о том, как я могу минимизировать размер своих сообщений, это было бы здорово. Я думаю, что в какой-то момент эти решения увеличат нагрузку на стороне клиента, но, возможно, стоит сократить сетевой трафик.

Ответы [ 3 ]

8 голосов
/ 09 июня 2010

Я согласен с Крейгом Штунцем: использование HTTP-сжатия динамического содержимого может быть очень эффективным. Но очень полезным может быть также уменьшение количества отправляемых данных.

Прежде всего, вы не должны отправлять HTML-данные обратно в jqGrid. jqGrid имеет пользовательский форматер (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_formatter и небольшой пример из jqGrid: редактируемый столбец, в котором всегда отображается выбор ), который можно использовать для заполнения <TD> элементов клетки jqGrid. Более того, данные html внутри данных jqGrid очень плохи, если вы хотите изменить данные сетки. В этом случае HTML-данные должны быть изменены и отправлены обратно на сервер. Поэтому наилучшим способом является отправка чистых данных с сервера в jqGrid и использование специального средства форматирования для форматирования данных в виде фрагмента HTML.

Как правило, вы можете использовать собственный форматтер для «декодирования» или «распаковки» данных. Например, если в столбце есть только такие данные, как «Bla Bla Bla» и «Ha Ha Ha», вы можете отправить 0 вместо «Bla Bla Bla» и 1 вместо «Ha Ha Ha». Внутри пользовательского форматера для столбца вы конвертируете 0 и 1 обратно в строки «Bla Bla Bla» и «Ha Ha Ha». Если у вас есть общие повторяющиеся данные, этот подход не будет работать, но вместо этого вы можете использовать следующий (jsonReader) способ.

Существует еще один способ сжатия данных: использование jsonReader в качестве функции (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#jsonreader_as_function и jquery с ASP.NET MVC - вызов веб-службы с поддержкой ajax ) и использование jsonmap (см. Отображение данных JSON в JQGrid , например), которое также можно использовать в качестве функции. Этот метод немного сложнее, но если вы добавите в свой вопрос пример данных JSON, которые вы отправляете в настоящее время, и пример определения jqGrid (особенно colModel), я напишу пример того, как вы можете использовать jsonReader и jsonmap для сжатия ваших данных.

ОБНОВЛЕНО : Одно место вашего кода кажется мне очень подозрительным:

Name = "<div class='showDescription' id= '" + i.id+ "'>" + i.Name + "</div>",

jqGrid добавил атрибут id в строку сетки (элемент <tr>), но вы вручную добавили тот же идентификатор к элементу <div> внутри ячейки (<td> элемент, который является дочерним для <tr> элемент). Это может создать вам много проблем. HTML не может иметь двойной идентификатор.

Соответствует вашему основному вопросу. Я могу написать много общих рекомендаций, таких как:

  • Лучше отправить логическое значение как 0 или 1 вместо "true" и "false" для уменьшения данных.
  • если у вас есть данные идентификатора в вашей сетке, вы можете использовать опцию ключевого столбца (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options), чтобы отправить значение идентификатора только один раз внутри ваших данных JSON.
  • Передайте значения даты в наиболее компактной форме yy-m-d и преобразуйте ее в текстовую форму, которую вы хотите на стороне клиента, относительно форматера даты.
  • и т. Д.

но, вероятно, вы хотите, прежде всего, решить основную проблему производительности в вашем конкретном приложении. Чтобы иметь возможность улучшить ваше конкретное приложение, вы должны опубликовать в своем вопросе дополнительную информацию о вашем решении:

  • Определение jqGrid, включая полное определение colModel (не как в длительная задержка между серверным JSON и jqGrid loadComplete на сайте asp.net mvc )
  • дамп данных из paginatedDat a, который вы возвращаете как Json(paginatedData) или лучше, ваши данные JSON отправляются клиенту (например, вы можете скопировать данные из Fiddler http://www.fiddler2.com/fiddler2/)
  • информация о версии используемого вами пользовательского интерфейса jqGrid, jQuery и jQuery
  • может быть также полезна дополнительная информация о вашей модели данных и базе данных

Без такой информации вы можете потратить свою награду без реальной выгоды для вас.

ОБНОВЛЕНО 2 : практический пример оптимизации данных JSON, который вы можете найти в Jqgrid 3.7 не показывает строки в Internet Explorer

1 голос
/ 08 июня 2010

В соответствии с вашим предложением, если вы хотите добавить html на стороне клиента, проверьте форматер jqgrid:

http://www.secondpersonplural.ca/jqgriddocs/_2kn0mlo1p.htm

-

Кроме того, хотя я предполагаю, что есть бизнес-причина для возврата более 200 записей на страницу, можно ли использовать нумерацию страниц на стороне сервера?

1 голос
/ 08 июня 2010

Установите свой сервер на ZIP-ответы .Это позаботится о повторных данных.

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