Pergunta

Tenho certeza que isso é fácil, mas não consigo descobrir:

Eu tenho uma página ASP.NET com alguns UpdatePanels.Eu quero que a página completamente carregue com algum texto 'Aguarde' nos UpdatePanels.Então, quando a página estiver completamente carregado Quero chamar uma função code-behind para atualizar o UpdatePanel.

Alguma idéia de qual combinação de Javascript e code-behind preciso para implementar essa ideia?

SAL

PS:Tentei colocar minha chamada de função no Page_Load, mas o código foi executado antes a página é entregue e, como a função que desejo executar leva algum tempo, a página simplesmente demora muito para carregar.

Foi útil?

Solução

Use um controle de timer que será acionado após um certo número de milissegundos (para o carregamento da página).No evento timer tick, atualize o painel de atualização.

Outras dicas

Eu brinquei com as sugestões do ScriptManager - que eu acho que eventualmente teria funcionado, mas me parece que a ideia do Timer é mais fácil de implementar e não é realmente (!) um hack?!

Veja como atualizei meu painel depois a renderização da página inicial foi concluída...

padrão.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>

e o código por trás de default.aspx.cs lê

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;
        }

    }
}

Portanto, a página é carregada e o Timer (contido no UpdatePanel) é acionado 2 segundos após o carregamento da página (eu acho - não tenho certeza de quando o Timer realmente inicia?).O texto do rótulo é reescrito e o temporizador é desativado para interromper mais atualizações.

Bastante simples - mas vocês, puristas, podem me dizer se este é um Hack Horrível?

Dê uma olhada em ScriptManager.RegisterStartupScript

A idéia é que você registre um script para ser executado na inicialização (acredito que assim que a página for carregada).Seu script deve chamar uma função que causa uma postagem de volta através do seu UpdatePanel

Fazer coisas assim com UpdatePanels em vez de algo facilmente compreensível VAI te incomodar, é só uma questão de quando.

Desde a primeira pergunta deste post, acho que o que o usuário está procurando é uma mensagem a ser exibida ao usuário enquanto o painel de atualização é carregado.Basta colocar um controle UpdateProgress como o abaixo em sua página logo acima do controle UpdatePanel e sinta-se à vontade para acionar um evento em seu UpdatePanel, coloque seu código de back-end normalmente e tudo o que estiver contido dentro do controle UpdateProgress será carregado enquanto seu UpdatePanel o conteúdo está sendo processado no back-end.

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

Não há necessidade de qualquer coisa complicada de javascript manual.

O ScriptManager.RegisterStartupScript permite que um script seja executado na inicialização dentro de um painel de atualização.se você usar o antigo ClientScript.RegisterStartupScript, o script renderizado estará fora dos limites do painel de atualização e, portanto, não será executado durante carregamentos de página assíncronos.

Usando a abordagem de Tom com o script de inicialização, você pode chamar:

__doPostBack('UpdatePanelName', '');

Um sinal de positivo e obrigado ao SAL e ao resto de vocês.Isso resolveu um grande problema que eu tinha: meu procedimento demorava até um minuto para a página finalmente ser renderizada e exibida.

Obrigado!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top