Сокращение времени загрузки страницы ASP.NET WebForms с большими таблицами

У меня есть страница WebForms с древовидным представлением слева и сетками справа. Когда пользователь щелкает узел древовидного представления, соответствующая сетка заполняется с помощью SqlDataSource, а затем отображается. Все это находится в одной панели UpdatePanel.

Вот моя установка:

<asp:GridView runat="server" ID='LocationsRowGrid' AutoGenerateColumns="false" DataSourceID="SqlDataSource_LocationRow">
    <Columns>
        <asp:TemplateField HeaderText="Location">
                <ItemTemplate>
                    <asp:DropDownList runat="server" ID="NAME_LCTN" OnDataBound="dropdown_DataBound"
                        DataTextField="NAME_TO_LCTN" DataValueField="NAME_TO_LCTN" DataSourceID="SqlDataSource_LocationNames">
                    </asp:DropDownList>
                </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Move Time (HR)">
            <ItemTemplate>
                <asp:TextBox runat="server" ID="STD_MOVE_TME_AMNT" Text='<%# Bind("STD_MOVE_TME_AMNT") %>'></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="LAST_UPDATED_BY" HeaderText="Updated By" Visible="true" />
        <asp:BoundField DataField="LAST_REV_DT" HeaderText="Revision Date" Visible="true" />
    </Columns>        
</asp:GridView>

Есть и другие (более крупные) сетки, но это в основном шаблон. Самая большая сетка имеет около двенадцати столбцов, примерно шесть из которых являются шаблонными полями с текстовыми полями, а один из них — шаблонным полем с раскрывающимся списком. Выпадающий список привязан к другой таблице, которая содержит около 150 элементов. Сама сетка насчитывает около 100 записей.

Это медленно. Похоже, что проблема может быть связана с рендерингом HTML - сервер не слишком долго отвечает, но браузеры (Chrome и IE) почти падают, пытаясь отобразить результат. Мое первое (очевидное) предположение заключается в том, что рендеринг 100 html-выборов, каждый из которых содержит> 100 элементов, будет медленным, особенно если это делается сразу внутри тегов таблиц, таких как ASP.NET.

Кажется ли это разумным предположением о причине медлительности?

Для этого проекта мне (в настоящее время) не разрешено использовать jQuery (или, предположительно, любую другую библиотеку javascript), и я должен оправдать любой используемый мной javascript. По сути, другим разработчикам не нужно какое-либо реальное понимание javascript, чтобы иметь возможность поддерживать это приложение, когда я закончу с ним.

Учитывая эти ограничения, могу ли я что-нибудь сделать, чтобы уменьшить размер возвращаемого HTML и/или время рендеринга в браузере? Заранее спасибо.


person Joel    schedule 17.06.2011    source источник
comment
Ваш gridview должен быть в UpdatePanel? Пойдите и прочитайте о том, как на самом деле работают панели обновлений, и что отправляется и принимается с сервера...   -  person Emyr    schedule 17.06.2011


Ответы (2)


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

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

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

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

person Gregory A Beamer    schedule 17.06.2011

Несколько мыслей для вас:

  1. «Отключите» рендеринг, чтобы увидеть, сколько времени отклика приходится на запросы на стороне сервера. Вы можете сделать это, закомментировав операторы DataSource=.
  2. Браузеры, как правило, ждут, пока не будет создана вся таблица, прежде чем отображать какую-либо ее часть. Вы можете попробовать разные макеты, чтобы не все было в одной таблице. Может быть, повторитель, где каждый элемент представляет собой отдельную таблицу? Затем каждый из них может отображаться по мере появления разметки.
  3. Вы можете начать гораздо больше интересоваться jQuery и AJAX для страниц вашего контента. Вместо 100 рядов может быть 10 рядов со страницами 1, 2, 3... ссылками?
person n8wrl    schedule 17.06.2011
comment
ОП сказал, что для этого проекта мне (в настоящее время) не разрешено использовать jQuery. Несмотря на то, что OP не может использовать jQuery, они все же могут использовать пейджинг, как вы упомянули, чтобы немного решить проблему со скоростью. - person ashelvey; 17.06.2011