NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!

UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI

Você está em: PrincipalArtigosASP.NET › Capítulo 07 : 02
Quer receber novidades e e-books gratuitos?
« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
ASP.NET - CURSO COMPLETO
Autor: Júlio Battisti

Lição 054 - Capítulo 07 - Uma classe chamada Page

A classe Page faz parte do namespace System.Web.UI. Este namespace possui uma série de classes e interfaces, as quais permitem a criação de controles e páginas, os quais formam a interface com o usuário em nossas aplicações Web. Temos, por exemplo, uma classe chamada Control, a qual disponibiliza todos os controles que podem ser utilizados em páginas ASP.NET. Também existe um controle chamado Page, o qual é automaticamente criado toda vez que é feita a requisição de uma página ASP.NET. Fazer a requisição significa acessar a página. Também estão disponíveis classes que nos possibilitam a ligação de dados com controles de um formulário e a manutenção de estado entre diferentes requisições à mesma página.

Eventos ao carregar uma página ASP.NET.

Quando acessamos uma página .aspx, como por exemplo:

http://www.microsoft.com/net/default.aspx

uma série de eventos são disparados. É semelhante ao carregamento de uma aplicação Windows tradicional. Ao carregarmos uma aplicação Windows desenvolvida, por exemplo, em Visual Basic, são disparados diversos eventos. Por exemplo, ao carregar o formulário principal da aplicação é disparado o evento OnLoad, ao exibir o formulário na tela é disparado o evento OnActivate e assim por diante. Ao carregarmos uma página .aspx são disparados, em seqüência, os seguintes eventos:

  • Page_Init: Disparado quando a página é inicializada.
  • Page_Load: Disparada quando a página é carregada.
  • Control Event: É disparado se um evento associado com um controle da página, faz com que a mesma tenha que ser recarregada.
  • Page_Unload: Disparado quando a página é retirada da memória.

A diferença básica entre os eventos Page_Init e Page_Load é em relação aos controles da página. Quando o evento Page_Init dispara, os controles da página ainda estão com seus valores padrão, pois o estado dos mesmos, caso tenham sido alterados, ainda não foi carregado. Já quando dispara o evento Page_Load, os controles estão com seus estados atualizados, sendo que já temos acesso aos reais valores de cada controle.

Esta seqüência de eventos reforça a idéia de que o modelo de programação baseado em eventos, foi transportado para o mundo das aplicações Web, pelo ASP.NET.

A classe Page.

Toda página .aspx acessada a partir de um servidor onde está instalado o Framework .NET , quer a página contenha código ASP.NET ou somente código HTML,  é compilada e é criado um objeto do tipo Page, o qual fica armazenado no cache de memória do servidor. Em outras palavras, ao acessarmos uma página .aspx a mesma é compilada, sendo gerada uma instância da classe Page, sendo está instância armazenada no cache do servidor para melhorar a velocidade de acesso à página. Qualquer alteração na página é, automaticamente, detectada pelo Framework .NET, a nova versão é compilada e armazenada no cache de memória do servidor, em substituição a versão anterior.

Na classe Page estão definidos as propriedades, métodos e eventos comuns a todas as páginas processadas pelo Runtime do ASP.NET. A classe Page funciona como um Container para todos os componentes que fazem parte da página. Como analogia, nas aplicações Windows, temos a figura do Formulário (Form), o qual é um Container para todos os elementos da aplicação.

Os eventos da classe Page.

Na Tabela 7.1 temos a descrição dos eventos da classe Page.

Evento Descrição
AbortTransaction Ocorre quando uma transação é cancelada.
CommitTransaction Ocorre quando uma transação é finalizada com sucesso.
DataBinding Ocorre quando um controle de servidor (Server Control) é vinculado a uma fonte de dados.
Error Ocorre quando uma é detectada uma exceção que não foi tratada.
Init Ocorre quando a página é inicializada.
Load Ocorre quando a página é carregada e todos os seus controles tiverem sido carregados.
PreRender Ocorre antes que qualquer informação seja enviada para o navegador do cliente.
Unload Ocorre quando o processamento da página é finalizado.

Tabela 7.1 Eventos da classe Page.

Isto ocorre após todas as informações terem sido enviadas para o navegador do cliente.

Vamos a um exemplo onde utilizamos o evento Load da página, para emitir uma mensagem.

Na Listagem 7.1 temos um exemplo de página, onde definimos o valor de um controle da página – controle Mensagem, durante o evento Load da página.

Listagem 7.1 – Utilizando o evento Load – chap7ex1.aspx.

<html>
<script language="C#"  runat="server">
     void  Page_Load(Object Src, EventArgs E) 
{
Mensagem.Value = "Último acesso em: " +  DateTime.Now;
 }
</script>
<body>
             <input  id="Mensagem" type=text size=60 runat="server"> 
</body>
</html>

Digite o código da Listagem 7.1 e salve o mesmo em um arquivo chamado chap7ex1.aspx, na pasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta página utilize o seguinte endereço:

http://localhost/chap7/chap7ex1.aspx

Ao carregarmos esta página no Internet Explorer obtemos o resultado indicado na Figura 7.1

Curso Completo de ASP.NET - Júlio Battisti
Figura 7.1 O evento Load da página – chap7ex1.aspx.

Em primeiro lugar quero reforçar o fato de termos a disposição um modelo de programação baseado em eventos, o que para o ambiente Web é um avanço significativo em relação as versões anteriores.

O segundo detalhe que gostaria de chamar a atenção é a utilização de um controle de servidor. Mais especificamente, utilizamos um HTML Server Control, para exibir a mensagem definida no evento Load da página. Utilizamos o controle Input, conforme indicado no trecho de código a seguir:

<input id="Mensagem" type=text size=60 runat="server"> 

Observe a propriedade runat=”server” definindo que este é um controle de servidor e que, portanto, temos acesso às suas propriedades através do código da página. Foi exatamente isto que fizemos no evento Load, quando definimos o valor da propriedade Load do evento Mensagem, conforme indicado a seguir:

void Page_Load(Object Src, EventArgs E) 
{
     Mensagem.Value = "Último acesso em: " +  DateTime.Now;
}

Podemos utilizar os eventos da classe Page, para uma série de funções, tais como:

  • Código para conexão com banco de dados.
  • Código para verificação das permissões de acesso.
  • Código para configuração dos controles da página.

As propriedades da classe Page.

Na Tabela 7.2 temos a descrição das propriedades da classe Page.

Propriedade Descrição
Application Faz referência a um objeto do tipo Application. Um único objeto do tipo Application é criado para cada aplicação Web. A instância do objeto Application é compartilhada por todos os clientes que acessam páginas da aplicação Web.
Cache Retorna uma referência a um objeto do tipo Cache, o qual pode ser utilizado para armazenar dados que são utilizados nas próximas solicitações da página. O objeto cache utiliza campos do tipo oculto para manter o estado dos elementos de uma página entre uma chamada e outra da página.
ClientTarget Esta propriedade permite alterar a detecção automática do Browser do cliente, que é feita pelo Framework .NET, e especificar o Browser que deve ser considerado para a montagem da página de retorno para o usuário.
EnableViewState É um valor Boleano (True ou False). O valor desta  propriedade indica se os controles da página devem ou não manter o seu estado entre uma chamada e outra da página. Esta propriedade afeta todos os controles da página. Por padrão é definida em True.
ErrorPage Pode ser utilizada para retornar ou definir a página que deve ser carregada, caso seja detectada uma exceção não tratada.
IsPostBack É um valor Boleano. Se for verdadeiro (True), indica que a página está sendo recarregada pelo usuário, o que é conhecido como um “round-trip” (ida e volta). Quando for False, significa que a página está sendo carregada pela primeira vez e, conseqüentemente, não existe valores de estado armazenados no cache do servidor, para os controles da página. Podemos utilizar esta propriedade para detectar se esta sendo feita a carga inicial da página e, em caso afirmativo, utilizar o evento Page_Load para definir os valores iniciais, para os controles da página.
IsValid Com o ASP.NET temos os chamados Validation Controls. Estes controles são capazes de fazer a validação dos dados digitados em um formulário. Se a validação de todos os controles ocorrer com sucesso, a propriedade IsValid é definida como True, caso contrário, a propriedade será definida como False. Se a página não tiver nenhum controle de validação, a propriedade retornará True.
Request Permite que tenhamos acesso aos dados enviados com a requisição HTTP da página. Esta propriedade retorna uma referência ao objeto Request. Estudaremos este objeto em detalhes, ainda neste capítulo.
Response Permite que tenhamos acesso aos dados enviados com HTTP response da página. Esta propriedade retorna uma referência ao objeto Response. Um Response está, geralmente, associado com um formulário. Estudaremos este objeto em detalhes, ainda neste capítulo.
Server Retorna uma referência ao objeto Server.
Session Retorna uma referência ao objeto Session.
TraceEnabled É uma propriedade Boleana. Retorna True se o Trace para a página estiver habilitado e False, caso contrário. O objeto Trace é utilizado para depuração de páginas.
Trace Retorna uma referência ao objeto Trace, caso o mesmo tenha sido habilitado.
User Obtém informações a respeito do usuário que está fazendo a requisição da página.
Validators Retorna uma coleção que contém todos os controles de validação da página.

Tabela 7.2 Propriedades da classe Page.

Vamos a um exemplo onde exibimos o valor de diversas propriedades da classe Page.

Na Listagem 7.2 temos um exemplo de página, onde são exibidos os valores de diversas propriedades da classe page.

Listagem 7.2 – Propriedades da classe Page – chap7ex2.aspx.

<%@ Import Namespace="System" %>
<html>
<script language="C#"  runat="server">
     void  Page_Load(Object Src, EventArgs E)
 {
      PrApplication.Value         =          Convert.ToString(Page.Application);
      PrCache.Value               =          Convert.ToString(Page.Cache);
      PrClientTarget.Value        =          Convert.ToString(Page.ClientTarget);
      PrEnableViewState.Value     =          Convert.ToString(Page.EnableViewState);
      Page.ErrorPage              =          "http://localhost/erros/erro.aspx";
      PrErrorPage.Value           =          Convert.ToString(Page.ErrorPage);
      PrIsPostBack.Value          =          Convert.ToString(Page.IsPostBack);
      PrIsValid.Value             =          Convert.ToString(Page.IsValid);
      PrRequest.Value             =          Convert.ToString(Page.Request);      
      PrResponse.Value            =          Convert.ToString(Page.Response);   
      PrServer.Value              =          Convert.ToString(Page.Server);        
      PrSession.Value             =          Convert.ToString(Page.Session);       
      PrTrace.Value               =          Convert.ToString(Page.Trace);          
      PrUser.Value                =          Convert.ToString(Page.User);           
 }
</script>
<body>
    <H1>Propriedades da classe Page   !!! </H1>
    <TABLE>
            <TR>
              <TD>
                 <B>Propriedade</B>
              </TD>
              <TD>
                 <B>Valor retornado.</B>
              </TD>           
            </TR>
            <TR>
              <TD>
            <B>Application: </B>
              </TD>
              <TD>
                        <input  id="PrApplication" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>Cache:  </B> 
              </TD>
              <TD>
                        <input  id="PrCache" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>ClientTarget:  </B> 
              </TD>
              <TD>
                        <input  id="PrClientTarget" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>EnableViewState:  </B> 
              </TD>
              <TD>
                        <input  id="PrEnableViewState" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>ErrorPage:  </B> 
              </TD>
              <TD>
                        <input  id="PrErrorPage" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>IsPostBack:  </B> 
              </TD>
              <TD>
                        <input  id="PrIsPostBack" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>IsValid:  </B> 
              </TD>
              <TD>
                        <input  id="PrIsValid" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>Request:  </B> 
              </TD>
              <TD>
                        <input  id="PrRequest" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>Response:  </B> 
              </TD>
              <TD>
                        <input  id="PrResponse" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>Server:  </B> 
              </TD>
              <TD>
                        <input  id="PrServer" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>Session:  </B> 
              </TD>
              <TD>
                        <input  id="PrSession" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>Trace:  </B> 
              </TD>
              <TD>
                        <input  id="PrTrace" type=text size=60 runat="server"> 
              </TD>
            </TR>
            <TR>
              <TD>
                        <B>User:  </B> 
              </TD>
              <TD>
                        <input  id="PrUser" type=text size=60 runat="server"> 
              </TD>
            </TR>
    </TABLE>
</body>
</html>

Digite o código da Listagem 7.2 e salve o mesmo em um arquivo chamado chap7ex2.aspx, na subpasta chap7, dentro da pasta wwwroot, conforme descrito anteriormente. Para acessar esta página utilize o seguinte endereço:

http://localhost/chap7/chap7ex2.aspx

Ao carregarmos esta página no Internet Explorer obtemos o resultado indicado na Figura 7.2

Curso Completo de ASP.NET - Júlio Battisti
Figura 7.2 Propriedades da classe Page – chap7ex2.aspx.

Alguns comentários sobre o exemplo.

No início da página utilizamos uma diretiva Import:

<%@ Import Namespace="System" %>

Utilizamos esta diretiva para termos acesso a classe Convert, do namespace System. Utilizamos o método ToString da classe Convert – Convert.ToString, para converter os valores retornados pelas propriedades da classe Page, em valores de texto e atribuir os valores de texto para controles do tipo input na seção de apresentação da página.

Na seção de código acessamos os valores para as propriedades da classe page. Por exemplo, para a propriedade Application, utilizamos o seguinte código:

PrApplication.Value = Convert.ToString(Page.Application);

Page.Application retorna o valor da propriedade Application. O valor retornado é convertido para String pelo método Convert.ToString. O valor já convertido para String é atribuído a propriedade Value do controle PrApplication, na seção de apresentação da página. O resultado prático disso tudo é que o valor da propriedade Application será exibido no controle PrApplication, na seção de apresentação.

Na seção de apresentação utilizamos uma tabela para exibir os controles melhor alinhados. Para isso utilizamos as tags do HTML para construção de tabelas:

  • <TABLE> </TABLE> para a criação da tabela.
  • <TR> </TR> para a criação de uma nova linha.
  • <TD> </TD> para a criação de uma nova célula em cada linha.

Nota: Para maiores detalhes sobre os comandos básicos da linguagem HTML consulte o Anexo I.

Para acessar as propriedades do objeto page, utilizamos a sintaxe padrão para acesso aos componentes de um objeto:

nome_do_objeto.nome_componente

Por exemplo, para acessar a propriedade Cahce, do objeto page, utilizamos a seguinte sintaxe:

Page.Cache.

Importante! Quando uma página .aspx é carregada, a mesma é compilada como um objeto que é uma instância da classe Page. Sendo um objeto, temos acesso a suas propriedades, métodos e eventos.

Métodos da classe Page.

Na Tabela 7.3 temos a descrição dos métodos da classe Page.

Métodos Descrição
DataBind Executa uma operação de DataBind para todos os controles da página.
FindControl Permite que localizemos um determinado controle, na página.
MapPath Retorna o caminho físico para um determinado diretório virtual.
Validade Faz com que os controles de validação da página, façam a validação de seus conteúdos.

Tabela 7.3 Métodos da classe Page.

O processamento de uma página ASP.NET.

Vamos analisar mais alguns detalhes sobre a maneira como uma página ASP.NET é processada no servidor e retornada para o usuário.

Para acessar um página, o usuário digita o endereço da página no seu navegador, como por exemplo:

https://juliobattisti.com.br/certificacao.aspx.

o navegador envia a requisição da página para o servidor IIS, através de uma requisição HTTP (HTTP Request). O servidor localiza os dados solicitados, envia de volta para o usuário e fecha a conexão. Este aspecto básico não mudou, até porque faz parte da definição do protocolo HTTP, independente do conteúdo que está sendo carregado. Porém, com ASP.NET, tivemos muitas melhorias em relação a maneira como a página é carregada e como as informações são mantidas entre uma requisição e outra.

Com o modelo atual parte do processamento acontece no navegador do cliente e parte no servidor. Normalmente no cliente são colocados os elementos visuais da página. No servidor são feitos os processamentos do código de script da página. Porém o processamento é do tipo “tudo de uma só vez”, ou seja, o cliente envia a requisição, o servidor processa todos os elementos da página, formata uma saída e retorna a saída formatada para o cliente. Para que possa haver um novo processamento, uma nova requisição da página, precisa ser feita.

Com ASP.NET temos uma mudança neste modelo, devido a criação dos chamados Server Controls. Um controle do tipo Server Control fornece elementos visuais para uma página ASP.NET, ao mesmo tempo que é processado no servidor. Estes controles tem, inclusive, um modelo de eventos que pode ser acessado via código. Com isso temos disponível um modelo de desenvolvimento baseado em eventos, semelhante ao desenvolvimento de aplicações Windows tradicionais.

Outra mudança que é possível, graças aos Server Controls, é em relação a iteração entre a página e o servidor. Como os Server Controls possuem eventos, podemos escrever código para ser executado em resposta a estes eventos. Este código de eventos é processado no servidor. Dentro de uma mesma requisição de página, podem ser disparados diversos eventos, a medida que o usuário vai trabalhando na página. Para cada evento, o código respectivo, caso exista, é processado no servidor. Observem que o cliente fica “indo e voltando” do servidor, para processar o código associado a eventos. Cada ida e vinda equivale a uma requisição. Este processo de ida e vinda é conhecido como “server round-trip.”

Para que um round-trip seja disparado, basta que o usuário realize alguma ação na página, ação esta que dispare um evento. Por exemplo, clicar em um campo para entrada de texto, para provocar um evento Click do respectivo controle.

Manutenção de estado é fundamental.

Conforme descrevemos no item anterior, o processo de round-trip faz com que diversas requisições sejam enviadas para uma mesma página .aspx. Se para cada requisição, toda a página tivesse que ser novamente processada, o desempenho deixaria muito a desejar. Além disso o protocolo HTTP é stateless, ou seja, não é mantida nenhuma informação entre uma requisição e outra. Para resolver este problema e manter o estado entre requisições, o ASP.NET utiliza um processo conhecido como ViewState, para manter todas as informações da página entre uma requisição e outra. O ViewState contém o estado (valores, propriedades, aparência, etc) para todos os controles de usuário de uma página ASP.NET.  A informação de estado é armazenada na forma de pares de valores. O objeto responsável pela manutenção de estado é derivado da classe System.Web.UI.StateBag. Todas as informações de estado são armazenadas como uma string, a qual é enviada de volta para o cliente. O navegador do cliente recebe a string com a informação sobre os controles e configura cada um com os mesmos valores que tinham no momento da requisição. A string com as informações de estado são retornadas na forma de um campo oculto, o qual, evidentemente, não é exibido na página. Podemos ver o conteúdo desta string, verificando o código fonte da página que é retornada. Por exemplo, no IE, podemos utilizar o comando Exibir -> Código fonte.

Conforme descrevemos anteriormente, o processo de ViewState é habilitado por padrão. Se por algum motivo quisermos desabilitar este processo, podemos utilizar a propriedade EnableViewState. Para desabilitar o mecanismo de ViewState utilize o seguinte comando no início da página:

<%@Page EnableViewState=”false” %>

Nota: Também podemos desabilitar o mecanismo de ViewState a nível de controle. Veremos isso mais adiante.

Com o mecanismo de round-trip e ViewState o ASP.NET traz para o mundo stateless do protocolo HTTP, um modelo capaz de fazer a manutenção de estado para aplicações Web. Este é um grande avanço, pois com as versões anteriores o programador era obrigado a fazer verdadeiros “malabarismos” para conseguir uma manutenção de estado eficiente. Com ASP.NET o próprio Framework .NET nos disponibiliza mecanismos eficientes para a manutenção de estado. Esta é mais uma das características que comprovam o objetivo do Framework .NET em oferecer o máximo de funcionalidade, deixando para o desenvolvedor, apenas o código relacionado com a lógica e a apresentação da aplicação.

« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
Quer receber novidades e e-books gratuitos?

 
 

Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

Todos os direitos reservados, Júlio Battisti 2001-2024 ®

LIVRO: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2016 - CURSO COMPLETO E PRÁTICO

DOMINE A PROGRAMAÇÃO VBA NO EXCEL - 878 PÁGINAS - CLIQUE AQUI