ASP.NET AJAX: запуск UpdatePanel после завершения загрузки страницы - PullRequest
7 голосов
/ 28 августа 2008

Я уверен, что это легко, но я не могу понять:

У меня есть страница ASP.NET с некоторыми панелями обновления. Я хочу, чтобы страница полностью загружалась с текстом «Пожалуйста, подождите» в UpdatePanels. Затем, когда страница полностью загружена 1006 *, я хочу вызвать функцию code-behind для обновления UpdatePanel.

Есть какие-нибудь идеи относительно того, какое сочетание Javascript и code-behind мне нужно для реализации этой идеи?

SAL

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

Ответы [ 8 ]

8 голосов
/ 28 августа 2008

Я возился с предложениями ScriptManager - которые, как мне кажется, я в конечном итоге получил бы, но мне кажется, что идея с таймером проще реализовать и на самом деле (!) Не так уж много хака?

Вот как я обновил панель после , когда начальный рендеринг страницы был завершен ...

default.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AJAXPostLoadCall._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <h2>And now for a magic trick...</h2>
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="True">
        </asp:ScriptManager>
        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <asp:Timer ID="Timer1" runat="server" Interval="2000" ontick="Timer1_Tick" />
                    <asp:Label ID="Label1" runat="server">Something magic is about to happen...</asp:Label>
                </ContentTemplate>
            </asp:UpdatePanel>

        </div>
    </form>
</body>
</html>

и код default.aspx.cs читает

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace AJAXPostLoadCall
{
    public partial class _Default : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        public void DoMagic()
        {
            Label1.Text = "Abracadabra";
        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            // Do the magic, then disable the timer
            DoMagic();
            Timer1.Enabled = false;
        }

    }
}

Итак, страница загружается, и таймер (содержащийся в UpdatePanel) срабатывает через 2 секунды после загрузки страницы (я думаю - я не уверен, когда таймер действительно запускается?). Текст метки переписывается, а затем таймер отключается, чтобы больше не останавливать обновления.

Достаточно просто - но можете ли вы, пуристы, сказать мне, если это ужасный хак?

2 голосов
/ 28 августа 2008

Посмотрите на ScriptManager.RegisterStartupScript

Идея состоит в том, что вы регистрируете скрипт для запуска при запуске (я полагаю, что после загрузки страницы). Ваш скрипт должен вызывать функцию, которая вызывает пост обратно через вашу UpdatePanel

1 голос
/ 03 июля 2009

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

<asp:UpdateProgress AssociatedUpdatePanelID="UpdatePanel1" ID="UpdateProgress1" runat="server">
  <ProgressTemplate>
    <div class="mystyleclass">
      Please Wait...
    </div>
  </ProgressTemplate>
</asp:UpdateProgress>

Нет необходимости в каких-либо грязных ручных JavaScript-вещах.

1 голос
/ 19 мая 2009

Делать подобные вещи с помощью UpdatePanels, а не чего-то, что легко понять, БУДЕТ укусить вас, вопрос только в том, когда.

1 голос
/ 28 августа 2008

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

0 голосов
/ 19 мая 2009

Большое спасибо и спасибо SAL и остальным вам, ребята. Это решило большую проблему, с которой я столкнулся: моя процедура занимала до минуты, пока страница наконец не отображалась и не отображалась.

Спасибо!

0 голосов
/ 28 августа 2008

Используя подход Тома со сценарием запуска, вы можете вызвать:

__ doPostBack ('UpdatePanelName', '');

0 голосов
/ 28 августа 2008

ScriptManager.RegisterStartupScript позволяет запускать скрипт при запуске внутри панели обновлений. если вы используете старый ClientScript.RegisterStartupScript, то скрипт, который вы отрисовываете, будет находиться за пределами панели udpate и, следовательно, не будет выполняться во время загрузки асинхронной страницы.

...