Как я могу отложить загрузку содержимого UpdatePanel до тех пор, пока страница не отобразится?

Старая рука в ASP.NET, новая для UpdatePanel. У меня есть страница отчетов, которая выполняет довольно длинный SQL-запрос ... сейчас занимает около 10 секунд. То, что я хотел бы сделать, это сделать мою страницу полностью визуализированной, с некоторым заполнителем текста (загрузка ...), а затем заставить UpdatePanel запустить процесс создания отчетов, отнимающий много времени, и обработать отчет, когда он будет завершен.

Итак ... моя теория состоит в том, чтобы использовать RegisterStartupScript (), чтобы запустить это и удалить строку из GetPostBackEventReference (), чтобы вызвать обновление UpdatePanel. Возникают некоторые проблемы:

1) Могу ли я на самом деле использовать GetPostBackEventReference с UpdatePanel или мне нужно вызвать его каким-либо другим способом? Использовать этот метод для кнопки внутри панели обновления?

2) Какое событие вызывается, когда ссылкой обратной передачи является UpdatePanel? Это мне не понятно. Я должен позвонить где-нибудь мой код привязки данных! Опять же, может быть, мне нужно использовать кнопку внутри?

Ответы на вопрос(4)

)) и показ некоторых твиков и немного больше деталей, которые я счел необходимыми:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:UpdatePanel ID="upFacebookImage" runat="server">
    <ContentTemplate>
        <asp:PlaceHolder runat="server" ID="PlaceHolderMediaPrompts" />
        <asp:Button ID="hiddenAsyncTrigger" runat="server" Text="AsyncUpdate" OnClick="WasPage_Load" style="display:none;" />
    </ContentTemplate>
</asp:UpdatePanel>

Замечания:

Скрытая кнопка жизненно важнаOnClick = параметрэто то, что определяет функцию сервера для вызова!

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

И чтобы вызвать его из клиентского Javascript, вы можете использовать:

document.getElementById("hiddenAsyncTrigger").click‌​();

Однако я нашел этонеобходимо чтобы это не вызывалось при последующих загрузках страниц (как этоненужные циклы загрузки страницы и последующее мерцание). Смотри аккуратный маленькийIsPostBack () проверьте ниже :)

например Чтобы вызвать это после загрузки страницы (согласно исходному вопросу), я просто добавил вызов, чтобы вызвать вышеуказанную строку кода в качестве параметра onload для основного тега Body следующим образом:

<body onload="DoPostLoad();">
...  
    <script type="text/javascript">
        function DoPostLoad()
        {
            if ( IsPostBack() != true ) // ***This is NEW and ESSENTIAL! ***
                document.getElementById("hiddenAsyncTrigger").click();
        }

        function IsPostBack() { // Ref. https://stackoverflow.com/questions/26978112/execute-javascript-only-on-page-load-not-postback-sharepoint
             var ret = '<%= Page.IsPostBack%>' == 'True';
             return ret;
        }
        . . .
    </script>
</body>

(не испытано).

УстановитьUpdateMode изUpdatePanel вусловный.

Добавьте это к вашему<head> раздел:

<script type="text/javascript">

    window.onload = __doPostBack('UpdatePanel1', ''); // Replace UpdatePanel1 with the ID of your UpdatePanel

</script>
Решение Вопроса

вот как я это сделал (правильно или неправильно):

Уловка - «Скрытый Асинхронный Запуск Обратной связи».

<asp:UpdatePanel ID="upFacebookImage" runat="server">
   <ContentTemplate>
      <!-- Your updatepanel content -->
   </ContentTemplate>
   <Triggers>
      <asp:AsyncPostBackTrigger ControlID="hiddenAsyncTrigger" EventName="Click" />
   </Triggers>
</asp:UpdatePanel>
<asp:Button ID="hiddenAsyncTrigger" runat="server" Text="AsyncUpdate" style="display:none;" />

Затем из JavaScript, когда вы хотите запустить асинхронную обратную передачу, вы делаете это:

__doPostBack('<%= hiddenAsyncTrigger.ClientID %>', 'OnClick');

В моем примере мне нужно было запустить асинхронную обратную передачу из конкретного события JS. Но вы можете прикрепить его к документу, готовому.

Кажется, я помню, как пробовал @Marko Ivanovski, но по какой-то причине это не сработало. Я думаю, что вам нужно указать элемент управления "возможность обратной передачи" (то есть кнопку) для запуска обратной передачи.

НТН.

 RPM198408 окт. 2010 г., 00:39
Интересно (не требуется в моем сценарии). Ты не оченьneed элемент управления UpdateProgress - просто создайте скрытый заполнитель и покажите его при запуске асинхронной обратной передачи. Элемент управления UpdateProgress (как и многие другие элементы управления сервером Web Forms) предназначен для удобства, но его легко заменить.
 RPM198407 окт. 2010 г., 23:12
Да, если вы хотите запустить определенный обработчик событий на стороне сервера, то да - вам нужно это сделать. В моем случае мне просто нужен был постбэк, чтобы снова запустить Page_Load. Рад, что это сработало.
 Zeek211 окт. 2017 г., 15:10
Я отвечу на свой собственный комментарий: необходимо добавить параметр / обработчик OnClick = в строку asp: Button, которая определяет функцию сервера для вызова.
 Zeek211 окт. 2017 г., 15:11
Это может помочь некоторым читателям: вместо: __doPostBack ('<% = hiddenAsyncTrigger.ClientID%>', 'OnClick'); - что вызвало ошибки для меня, я просто использовал это вместо: document.getElementById ("hiddenAsyncTrigger"). click ();
 Bryan07 окт. 2010 г., 23:36
Один недостаток ... кажется, что элемент управления UpdateProgress не будет запущен, если вы вручную отправляете обратно.
 Bryan07 окт. 2010 г., 21:11
Бинго, это помогло. Небольшая модификация, в которой я использовал GetPostBackEventReference (btnTrigger, string.Empty); и затем RegisterStartupScript ().
 Zeek211 окт. 2017 г., 10:09
Где указана функция обновления на стороне сервера?
 Zeek211 окт. 2017 г., 15:16
Кроме того, вы можете при желании поместить скрытую кнопку внутри UpdatePanel, в этом случае вам не нужно определять триггеры (так как это будет дочерний элемент управления, который автоматически включается).
 Trajanus25 мая 2012 г., 20:56
Я просто хочу сказать, что style = "display: none;" на кнопке, а не Visible = false имеет решающее значение. При использовании Visible = false я смог инициировать обратную передачу (используя GetPostBackEventReference), но она не была асинхронной.

я собрал воедино в основном первый ответ выше.

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

Мой HTML:

<asp:UpdatePanel ID="udpCheckout" runat="server" UpdateMode="Always">
        <ContentTemplate>
            <asp:Image ID="imgSpinner" runat="server" Visible="true" ImageUrl="~/images/ajax-loader.gif" />
            <br />
            <asp:Label ID="lblWait" runat="server" Visible="true" Text="Please wait..."></asp:Label>
            <asp:Button ID="hiddenAsyncTrigger" runat="server" Text="AsyncUpdate" style="display:none;" />
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="hiddenAsyncTrigger" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>

Мой код за фрагментами:
В page_load:

ScriptManager.RegisterStartupScript(Me.Page, Me.Page.GetType, "LoadUpdate", GetPostBackEventReference(hiddenAsyncTrigger, String.Empty), True)

И обработчик кнопки:

Sub LoadUpdatePanels(ByVal o As Object, ByVal e As EventArgs) Handles hiddenAsyncTrigger.Click
        System.Threading.Thread.Sleep(5000)  'wait 5 seconds so I can see the page change
        imgSpinner.Visible = False
        lblWait.Text = "Content is now loaded."
        'udpCheckout.Update()
    End Sub

Это был мой тест, чтобы увидеть, смогу ли я заставить его работать. Теперь, чтобы заменить все это реальным кодом!

Ваш ответ на вопрос