Ограничение просмотра информации о состоянии вызовов AJAX - PullRequest
3 голосов
/ 16 января 2012

У меня есть форма заявки и GridView на той же странице. Выбор строки в GridView заполняет текстовые поля в форме ввода над ней всеми записями строки GridView.

Когда эта страница открывается и в GridView выбирается любая строка, я вижу много данных о состоянии просмотра, отправляемых на сервер с каждым запросом AJAX. Я выбрал опцию View Source браузера, чтобы проверить это. Я попытался отключить состояние просмотра в верхней части страницы, используя: EnableViewState = "false", но мое приложение перестало работать правильно.

При выборе любой строки в GridView генерируется ошибка, и поэтому я снова включил состояние просмотра.

Существует ли какой-либо оптимизированный способ использовать View State и поддерживать небольшие запросы AJAX? Что-нибудь связанное со сжатием View State?

Я использую ASP.NET 2.0.

Ответы [ 5 ]

4 голосов
/ 23 января 2012

С того момента, как вы используете UpdatePanel, из коробки ajax call вы становитесь палкой для отправки всех данных формы , включая состояние большого просмотра.

У вас есть дваодним из способов является выполнение пользовательского вызова ajax, ориентированного только на изменение , которым вы управляете, а не полный пост, который выполняет UpdatePanel.

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

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

http://www.codeproject.com/Articles/14733/ViewState-Compression

http://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspx

http://www.bloggingdeveloper.com/post/How-To-Compress-ViewState-in-ASPNET-20-ViewState-Compression-with-SystemIOCompression.aspx

и аналогичный вопрос, который я задал: Как ограничить количество значений записей на UpdatePanel?

3 голосов
/ 24 января 2012

Во-первых, если вы используете UpdatePanel, не делайте. Это не очень эффективно. По сути, это полный пост обратно, которого вы явно пытаетесь избежать.

Почему бы не использовать запрос GET AJAX? Это не будет ничего публиковать на сервере, кроме URL-адреса вашего прохождения, который может включать в себя идентификатор нужной вам строки?

В основном:

Создайте веб-сервис, который будет возвращать нужные вам данные.

Свяжите событие onclick с кнопкой Select в каждой строке сетки. (Вероятно, это проще всего сделать на стороне сервера событий связывания, используйте объект привязки, чтобы получить идентификатор строки)

В вызове события веб-сервис, созданный выше (http://api.jquery.com/jQuery.get/)

В методе onSuccess события javascript создайте нужную запись.

1 голос
/ 28 января 2012

Как указывалось во всех постах, вы можете сделать некоторую форму сжатия несколькими способами, вы можете реализовать ее самостоятельно или купить компрессор viewstate, но это вам не сильно поможет. Что может быть интересным - это степень сжатия, которую вы должны ожидать. Взгляните на: RadCompression , чтобы получить некоторую информацию о степени сжатия и улучшениях производительности, которые в целом одинаковы для всех вариантов (бесплатно / платно).

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

Теперь, если я правильно понимаю, вы хотите отредактировать строку сетки в форме на той же странице. Из комментариев вы используете панель обновлений, и в соответствии с описанным поведением у вас есть и сетка, и форма редактирования на панели обновлений. Если на вашей странице есть только сетка и форма редактирования, размещение их на панели обновлений совсем не поможет.

Я сделал небольшой пример для целей тестирования, и у меня была сетка из 10 строк с 5 столбцами и форма редактирования для 5 полей на одной странице. Мои наблюдения:

  1. Наличие сетки без стиля дало мне 1500 знаков состояния, которое составляет 2 КБ. Добавление стилей позволит вам получить гораздо больше данных в viewstate, вы можете проверить любые примеры платных элементов управления сеткой и увидеть, что количество несжатого viewstate постоянно увеличивается для сотен строк.
  2. Постбэк страницы отверстия (без панели обновления) на выбранном элементе сетки сделал запрос 3 КБ и получил ответ 6 КБ
  3. Постбэк с использованием панели обновления, которая окружает сетку и форму редактирования, сделал запрос 3 КБ и получил ответ примерно 6 КБ. Размер контента практически не меняется.

Это потому, что использование панели обновления в основном означает, что вы обновляете не всю страницу, а только область внутри панели обновлений + состояние представления. Так что, если вся ваша страница окружена панелью обновлений, это вам совсем не поможет, и нечестно называть ее AJAX:).

Теперь у веб-форм asp.net есть свои сильные стороны, но я считаю, что никому больше не нравятся веб-формы asp.net, особенно когда под рукой есть asp.net mvc / wcf / jquery. Ваш вопрос доказывает одно из ограничений веб-форм asp.net при использовании по назначению.

Мое общее решение вашей проблемы:

  1. Используйте только элементы управления html для отображения данных (ваша сетка должна быть плагином jquery / extjs, который отображает данные json, полученные из веб-службы с поддержкой ajax WCF). Избавление от сетки asp поможет вам практически полностью уменьшить представление и сделать источник вашей страницы читабельным.
  2. Создание веб-службы Ajax WCF и обмен json в отношении <-> wcf клиента (примеры используемых методов: getgriddata, addnewrow, deleterow, editrow). Наличие этих методов означает, что вам вообще не придется отправлять постбэк, и это сделает вашу страницу еще приятнее и отзывчивее. Также я бы постарался не использовать какой-либо код в событиях страницы.
  3. Позвоните в ваш веб-сервис, используя jquery или другой javascript Framework, который вы предпочитаете убедившись, что вы не используете ужасный asp: ScriptManager поможет вам избавиться от нескольких вызовов /ScriptResource.axd? и какой-то странный вид в исходном javascript, который делает некоторые подключения.
1 голос
/ 24 января 2012

Я согласен с Кевином М и Аристосом. Кроме того, существует другой способ минимизировать размер передаваемого ViewState: сохранить его на стороне сервера с помощью настраиваемого поставщика ViewState. В этой статье описывается, как создать такого провайдера: http://www.codeproject.com/Articles/8001/ViewState-Provider-an-implementation-using-Provide.

Какие подводные камни возникают при использовании настраиваемого поставщика состояния просмотра?

0 голосов
/ 23 января 2012

Краткий ответ - НЕТ.

Вот способ освободить страницу из сцеплений viewstate при вызовах ajax

  • Не зависит от события щелчка строки вида сетки.
  • Добавить столбец ссылок в сетку. Не используйте событие щелчка на сервере.
  • ссылка Когда пользователь щелкает ссылку, совершает ajax-вызов, отправляя идентификатор строки. Вы будете использовать jQuery для вызова ajax get.
  • Как только вызов ajax вернется, возьмите данные записи и найдите элементы формы, снова используя jQuery, и заполните их
...