Sie sind auf Seite 1von 159

T u t o r i a l d e A S P.

N E T

NPDS
TUTORIAL ASP.NET

DE

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 1

T u t o r i a l d e A S P. N E T

ndice

Lio 1: Introduo ao ASP.NET.......................................................................... 4 Introduo....................................................................................................... 4 O projeto Web Application.................................................................................. 5 Editando um Web Form em modo grfico.............................................................. 6 Sumrio.......................................................................................................... 7 Lio 2: Controles ASP.NET..................................................................................8 HTML Controls e Web Controls............................................................................ 8 Os Controles HTML............................................................................................ 9 Os Web Controls ............................................................................................ 13 Controles de ao........................................................................................ 13 Especificando comandos de aes.............................................................. 18 Controles de edio de dados........................................................................ 23 Controles de seleo.................................................................................... 30 Controles variados....................................................................................... 40 Sumrio......................................................................................................... 45 Lio 3: Trabalhando com estilos.......................................................................46 Capacidades do navegador .............................................................................. 46 Layout da pgina............................................................................................ 50 Uso de Panels................................................................................................. 51 Estilos em .NET............................................................................................... 54 Adicionando arquivos CSS ao projeto.............................................................. 55 O atributo Style........................................................................................... 55 As propriedades de controles......................................................................... 56 Escolhendo que tipo de estilo utilizar.............................................................. 56 Sumrio......................................................................................................... 57 Lio 4: Validao de dados...............................................................................58 Introduo..................................................................................................... 58 Os controles de validao................................................................................. 58 Sumrio......................................................................................................... 62 Lio 5: Acesso a bancos de dados.................................................................... 64 Relembrando ADO.NET..................................................................................... 64 Visualizando os dados de banco de dados........................................................... 65 Atualizando dados do banco.............................................................................. 69 Utilizando dados desconectados......................................................................... 73 Os controles DataList e DataGrid....................................................................... 77 Lio 6: Ciclo de vida de pgina e controles.....................................................100 O modelo de pgina de ASP.NET...................................................................... 100 O ciclo de vida de uma pgina ASP.NET............................................................ 100 O ciclo de vida de uma pgina......................................................................... 103 Sumrio ...................................................................................................... 108 Lio 7: Mantendo dados entre requisies..................................................... 109 Introduo................................................................................................... 109 Permanncia de dados de usurio no cliente...................................................... 109 View State................................................................................................ 109

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 2

T u t o r i a l d e A S P. N E T

Campos de formulrio escondidos................................................................ 112 Cookies.................................................................................................... 114 Strings de endereo................................................................................... 115 Permanncia de dados de usurio no servidor.................................................... 117 Estado de Aplicao................................................................................... 118 Estado de Sesso....................................................................................... 120 Suporte a banco de dados .......................................................................... 123 Redirecionando usurios para outra pgina....................................................... 124 Redirecionando pginas via servidor............................................................. 124 Redirecionando pginas via navegador.......................................................... 124 Sumrio....................................................................................................... 125 Lio 8: Utilizando scripts de cliente................................................................126 Introduo................................................................................................... 126 Incluindo scripts de cliente em Web Forms........................................................ 127 Incluindo scripts de cliente em Web Forms........................................................ 127 Incluindo scripts atravs de programao...................................................... 128 Gerando componentes customizados............................................................ 130 Escolhendo o mtodo de gerao de scripts de cliente......................................... 130 Sumrio....................................................................................................... 132 Lio 9: Controlando dados de requisio e resposta.......................................134 Introduo................................................................................................... 134 O modelo ASP.NET......................................................................................... 135 O objeto Request........................................................................................... 136 O objeto Response......................................................................................... 138 Sumrio....................................................................................................... 138 Lio 10: Utilizao de cookies........................................................................ 139 Introduo................................................................................................... 139 Cookies em ASP.NET...................................................................................... 139 Criar cookies............................................................................................. 140 Ler um cookie........................................................................................... 140 Apagar um cookie...................................................................................... 140 Lio 11: Configuraes de segurana.............................................................144 Introduo................................................................................................... 144 Segurana de senhas..................................................................................... 144 Conexo com o usurio.................................................................................. 147 Validao de dados........................................................................................ 148 Logging........................................................................................................ 150 Controle de acesso........................................................................................ 151 Autenticao............................................................................................. 151 Autorizao............................................................................................... 154 Sumrio....................................................................................................... 156 Lio 12: Utilizao de cache...........................................................................157 Introduo................................................................................................... 157 Fazendo cache de pginas inteiras................................................................... 157 Cacheabilidade.......................................................................................... 158 Sumrio....................................................................................................... 159

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 3

T u t o r i a l d e A S P. N E T

Lio 1: Introduo ao ASP.NET

Esta lio mostra os entendimentos bsicos de ASP.NET. Os objetivos so:


Apresentar os conceitos iniciais de ASP.NET Mostrar como criar um projeto ASP.NET no Visual Studio Apresentar o bsico da edio de um Web Form ASP.NET

Introduo ASP.NET uma tecnologia da Microsoft para desenvolvimento de aplicaes Web. Ele composto de uma nova arquitetura que pretende reduzir o tempo de desenvolvimento desses tipos de aplicao. O ASP.NET embutido no Framework .NET da Microsoft, e aplicaes ASP.NET precisam do Framework para serem executadas. Uma aplicao ASP.NET necessita de um servidor IIS (Internet Information Services) verso 5.0 ou superior para ser acessada. As aplicaes ASP.NET rodam em um servidor e podem ser acessadas de qualquer navegador/sistema operacional sem qualquer requerimento especfico. Atualmente, muito comum aplicaes Web serem programadas por meio de scripts, como ASP ou PHP. Tais linguagens tem o modelo procedural, bastante conhecido por programadores. Este modelo funciona na base do pr-processamento: o interpretador do script l o arquivo de script, passando pelo cdigo HTML, e quando encontra uma tag de script, ele executa o cdigo. Algumas dificuldades surgem quando se programa neste modelo. Em primeiro lugar, existe a mistura entre a apresentao com o cdigo de programao. Por exemplo, para mostrar uma caixa de combinao com dados carregados de um banco de dados, normalmente voc mistura o cdigo de programao com cdigo de HTML. Isso gera uma dificuldade para separar tarefas e modularizar corretamente o software. Em softwares grandes, com equipes grandes, o modelo procedural exige maior trabalho na modelagem do sistema, muitas vezes por causa da falta de reaproveitamento de cdigo de interface e da incompatibilidade do modelo procedural da aplicao com o modelo orientado a objeto da interface (HTML). ASP.NET tenta suprimir esses problema, oferecendo uma arquitetura e uma interface de desenvolvimento rpido. A pgina no mais um script ou arquivo escrito em linguagem procedural; ao invs disso, uma classe que possui propriedades e eventos. A pgina compilada e executada quando requisitada pelo usurio. Todos os componentes da pgina (caixas de texto, botes, etc.) so objetos compilados. Seus eventos so executados no servidor. Um projeto ASP.NET totalmente orientado a objeto, e isso permite uma modelagem mais facilitada, ou pelo menos mais moderna, do que o modelo procedural. Alm disso, existe uma separao mais clara do que interface e o que cdigo de programao, permitindo uma melhor diviso de tarefas.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 4

T u t o r i a l d e A S P. N E T

A interface de desenvolvimento privilegia o desenvolvimento rpido. Ela muito semelhante s interfaces de desenvolvimento para desktop bem conhecidas como Delphi, Net Beans, e o prprio Visual Studio. As linguagens de desenvolvimento de cdigo de programao para ASP.NET podem ser qualquer uma que o .NET suporte, como VB.NET e C#. A linguagem de apresentao o ASP.NET. Neste tutorial, estar sendo usado o C#.

O projeto Web Application Para iniciar o tutorial, vamos a um exemplo prtico, criando o projeto Web Application no Visual Studio. Com o Visual Studio aberto, selecione o menu File, na opo New e Project. A tela New Project ir abrir. Selecione o Project Types para Visual C# Projects, e escolha ASP.NET Web Application para Templates. Escolha um nome para o projeto e clique em OK. Uma coisa a se notar na janela de New Project a localizao do projeto. Por padro, ela sempre uma pasta com o mesmo nome do projeto na raiz do servidor Web instalado na mquina. Este endereo padro pode ser modificado, mas ele precisa ser acessvel pelo IIS para que o projeto possa ser criado. Quando um projeto Web Application criado, ele automaticamente cria alguns arquivos dentro do projeto. Os principais so:

Global.asax Este arquivo um arquivo de cdigo que configura os eventos principais da aplicao, como eventos de incio e fim da aplicao e de sesses de usurio. S h um por projeto. Web.config Este arquivo configura vrios aspectos da aplicao, como mtodos de autenticao, mtodos de manuteno de estado de sesso e mtodos de tracing da aplicao. Um arquivo Web.config configura a aplicao na pasta onde est e todas as suas sub-pastas. Mas voc pode configurar a aplicao de mtodo diferente para cada pasta da aplicao. WebForm1.aspx Este um Web Form. Os Web Forms so os principais componentes de uma aplicao ASP.NET. Elas correspondem as pginas HTML montadas dinamicamente. Um Web Form, na ver, so formados por dois arquivos: Arquivo de apresentao O arquivo de apresentao contm as informaes de layout da pgina. Ele escrito em ASP.NET e tem a extenso ASPX. ASP.NET muito semelhante a HTML, com algumas tags especficas de ASP.NET. nele que esto definidos os objetos de tela, botes, caixas de texto, menus, imagens, scripts, etc. O arquivo de apresentao indica um arquivo de cdigo que ir ser executado para responder os eventos de cada componente da tela.

Arquivo de cdigo O arquivo de cdigo contm o cdigo de programao utilizado para responder aos eventos da pgina e dos componentes da pgina. Ele compilado e armazenado no servidor Web em formas de dll. Ele executado em momentos como resposta a um clique de boto do usurio, uma mudana do item selecionado na caixa de

Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 5

T u t o r i a l d e A S P. N E T

combinao ou quando a pgina carregada. O cdigo pode ser escrito em qualquer linguagem suportada pelo .NET Framework. O Visual Studio abre o arquivo WebForm1.aspx para edio em modo grfico. possvel visualizar o cdigo ASP.NET clicando no boto HTML, na parte inferior da pgina.

Editando um Web Form em modo grfico Vamos mostrar um exemplo de como se pode criar uma pgina interativa utilizando-se o designer grfico. 1. A partir da Toolbox do Visual Studio posicione um controle Button e um controle TextBox na pgina. 2. Selecione o Button e configure a propriedade Text para Clique. A propriedade pode ser modificada na janela Properties 3. Faa um duplo clique no boto. O arquivo WebForm1.aspx.cs ser aberto para edio. O arquivo WebForm1.aspx.cs o arquivo de cdigo relacionado com o arquivo WebForm1.aspx para responder aos eventos da pgina e dos componentes. 4. Neste caso, o Visual Studio automaticamente cria um mtodo para responder ao evento de clique do boto. Entre as chaves, escreva o seguinte cdigo: TextBox1.Text = "Hello, World"; 5. Execute o projeto teclando F5, e clique no boto Clique. O que se pode observar que, diferentemente das linguagens procedurais normalmente utilizadas para criar aplicaes Web, ASP.NET possui uma arquitetura bastante diferente, oferecendo ao desenvolvedor uma interface desenvolvimento mais parecida com o desenvolvimento desktop. O cdigo deste programa o seguinte: Listagem 1.1: Exemplo de um Web Form

Arquivo Listagem01_01.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem1_1.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 16px" runat="server"></asp:TextBox> <asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server" Text="Clique"></asp:Button> </form> </body> </HTML>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 6

T u t o r i a l d e A S P. N E T

Arquivo Listagem01_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Listagem1_1 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { TextBox1.Text = "Hello, World"; }

new

Nas prximas lies, estaremos falando mais sobre os controles que podem ser colocados em uma pgina ASP.NET e como ASP.NET funciona por trs das cmeras.

Sumrio Nesta lio, voc aprendeu um pouco sobre o que ASP.NET e como ela procura resolver alguns problemas relacionados ao desenvolvimento Web. Voc aprendeu a criar um novo projeto ASP.NET no Visual Studio e foi apresentado aos editores grfico e texto da apresentao, e ao editor de cdigo de programao.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 7

T u t o r i a l d e A S P. N E T

Lio 2: Controles ASP.NET

Controles so os elementos de tela que voc pode adicionar a uma pgina ASP.NET. Esta lio mostra alguns dos controles mais comuns j inclusos com o .NET Framework. Os objetivos da lio so:

Apresentar Apresentar Apresentar Apresentar Apresentar Apresentar

as diferenas entre HTML Controls e Web Controls os HTML Controls os Web Controls de ao os Web Controls de edio de dados os Web Controls de seleo outros Web Controls relevantes

HTML Controls e Web Controls Os controles prontos de ASP.NET se dividem em dois grupos: os HTML Controls e os Web Controls. Estes controles so elementos para serem inseridos em tela, e so sempre classes do Framework .NET. Portanto, estes objetos rodam no servidor e podem ter suas propriedades modificados por meio de programao. Esses controles podem ser definidos dinamicamente, por meio de cdigo em tempo de execuo, ou em tempo de projeto de interface.

HTML Controls

Normalmente, os elementos HTML so opacos ao servidor, eles so passados diretamente para o navegador. ASP.NET mapeou alguns deles para que possam ser programveis no servidor. Os objetos tm as propriedades quase correspondentes ao elemento HTML real. Os controles HTML de servidor so objetos ASP.NET que mapeiam os elementos HTML, e portanto, so visveis e programveis no servidor. Os controles HTML possuem as seguintes caractersticas:

O modelo de objetos programvel com tcnicas orientadas a objeto familiares Os eventos dos elementos podem ser escritos da mesma forma como se faz para forms baseados em cliente, s que os eventos so manipulados no servidor possvel manipular eventos com scripts de cliente A manuteno do estado do evento automtica (os valores so preservados entre round trips) possvel utilizar controles de validao com controles HTML possvel bindar dados com controles HTML Suporta estilos com CSS possvel adiconar mais atributos ao objeto

Web Controls

Os controles de servidor web (Web Controls) so um conjunto de controles com nfase diferente. Eles definem controles abstratos que tm algum objetivo na pgina, e, porventura, podem gerar elementos HTML diferentes, de acordo com as propriedades configuradas para ele. Por exemplo, o controle RadioButtonList pode ser gerado em uma
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 8

T u t o r i a l d e A S P. N E T

tabela ou em HTML inline, de acordo com suas propriedades. O controle TextBox pode gerar um input do tipo text ou um textarea, de acordo com a propriedade TextMode. Existem controles simples que geram elementos bsicos como caixas de texto e botes, e existem elementos mais complexos como grid de dados, tabelas, etc. Os controles de servidor web possuem as seguintes caractersticas:

Modelo de objetos rico Deteco automtica de navegador o controle detecta as capacidades do navegador e renderiza HTML de acordo Para alguns controles, possvel definir quando ser realizado o postback (envio de dados) se imediato ou cacheado para a submisso do form A habilidade de passar eventos para controles aninhados (como um boto em uma tabela)

Os Web Controls e os HTML Controls, por terem caractersticas diferentes, so utilizados com diferentes propsitos. Abaixo est uma tabela comparativa entre os controles:

Utilizando controles HTML de servidor (HTML Controls)

Vantagens: O modelo de objetos parecido com o HTML Uma pgina escrita em HTML pode ser passada rapidamente para ASP.NET A interao com scripts mais simples, sem criao de controles complexos mais simples escrever scripts de cliente para controles HTML A sintaxe ASP.NET para criar controles HTML mais amigvel para web designers Desvantagens Todas as propriedades so strings, no h checagem de tipo H suporte para navegadores mais modernos, mas no h deteco automtica de navegador

Utilizando controles Web de servidor (Web Controls)

Vantagens: O modelo de objetos similar a qualquer objeto .NET A pgina pode ser visualizada em navegadores diferentes possvel utilizar um controles especializados, como calendrio e banner dinmico possvel um melhor controle na checagem de erro e uma programao mais limpa possvel criar controles mais complexos e ricos O Framework .NET identifica o navegador do cliente e gera o cdigo adaptado para as capacidades do navegador Desvantagens: mais difcil controlar o modo como o controle ir ser renderizado em HTML mais difcil customizar um controle

Os Controles HTML

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 9

T u t o r i a l d e A S P. N E T

Os HTML Controls so objetos .NET que foram modelados (propriedades) de forma a representar um elemento HTML. Existem diversos tipos de controles HTML, cada um mapeando um tipo diferente de elemento HTML. Os objetos HTML Controls so encontrados no namespace System.Web.UI.HtmlControls. Voc pode criar um objeto HTML Control programacionalmente simplesmente instanciando a classe especfica. Por exemplo, para criar uma caixa de texto via programao, voc pode realizar o seguinte: HtmlInputText txt = new HtmlInputText(); txt.Style.Add("position", "absolute"); txt.Style.Add("top", "100px"); txt.Style.Add("left", "100px"); this.Controls.Add(txt); Se voc colocar este cdigo no evento de Load da pgina, ele ir colocar um elemento input do tipo text na pgina. Note que o objeto HtmlInputText possui propriedades que voc encontra no elemento HTML (Style). De fato, quando visualizado, este trecho de cdigo adiciona o seguinte HTML em sua pgina: <input name="_ctl0" left:100px;" /> type="text" style="position:absolute; top:100px;

O cdigo desta pgina est na Listagem 2.1. Listagem 2.1: Exemplo de HTML Controls

Arquivo Listagem02_01.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem2_1.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> </form> </body> </HTML>

Arquivo Listagem02_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 10

T u t o r i a l d e A S P. N E T

namespace Listagem2_1 { public class WebForm1 : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here HtmlInputText txt = new HtmlInputText(); txt.Style.Add("position", "absolute"); txt.Style.Add("top", "100px"); txt.Style.Add("left", "100px"); this.Controls.Add(txt); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

Ao invs de colocar elementos programacionalmente na pgina, normalmente voc ir querer posicion-los em tempo de design na pgina. Para isso, basta realizar 2 passos: 1. arrastar um Text Field da aba HTML da Toolbox 2. abrir o editor da pgina em modo HTML e colocar a propriedade runat=server O cdigo da caixa de texto fica assim: <INPUT runat="server" style="Z-INDEX: 101; LEFT: 40px; POSITION: absolute; TOP: 48px" type="text"> A vantagem de se utilizar essa segunda forma que possvel avaliar o layout da pgina antes de executar a pgina e, de fato, a forma que voc vai utilizar mais. A propriedade runat=server faz com que o Visual Studio crie os objetos na classe de programao. Assim, voc pode alterar propriedades do elemento dinamicamente. Por exemplo, se voc colocar o seguinte cdigo no mtodo de Load da pgina, voc pode alterar o contedo da caixa de texto: txt1.Value = "Ol Mundo"; Se voc no especificar a propriedade runat=server para um elemento, o Framework ir ignorar o elemento, passando-o diretamente para o cliente, sem interpretao de cdigo. Ou seja, sem a propriedade, o Framework ir tratar o elemento como HTML normal. Com a propriedade, o Framework cria objetos para manipulao dinmica do elemento. O cdigo da listagem 2.2 mostra como esse exemplo pode ser implementado. Listagem 2.2: Exemplo de HTML Controls:
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 11

T u t o r i a l d e A S P. N E T

Arquivo Listagem02_02.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem2_2.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <INPUT name="txt1" id="txt1" runat="server" style="ZINDEX: 101; LEFT: 40px; POSITION: absolute; TOP: 48px" type="text"> </form> </body> </HTML>

Arquivo Listagem02_02.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Listagem2_2 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.HtmlControls.HtmlInputText txt1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here txt1.Value = "Ol Mundo"; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 12

T u t o r i a l d e A S P. N E T

} Existem vrios tipos de HTML Controls. Entre eles esto:


HtmlAnchor: cria o elemento a na pgina HtmlButton: cria o elemento button na pgina HtmlForm: cria o elemento form na pgina. Todo Web Form possui um destes HtmlImage: cria o elemento img na pgina HtmlInputText: cria o elemento input, do tipo text, na pgina HtmlInputFile: cria o elemento input, do tipo file, na pgina HtmlInputHidden: cria o elemento input, do tipo hidden, na pgina HtmlInputButton: cria o elemento input, do tipo button, na pgina HtmlSelect: cria o elemento select na pgina HtmlTable: cria o elemento table na pgina. Pode ter vrios outros sub-elementos, como o HtmlTableRow e o HtmlTableCell.

Existem outros controles disponveis, que podem ser visualizados na documentao do .NET Framework. Cada um deles possui um conjunto de propriedades muito semelhante ao do elemento que ele gera.

Os Web Controls Os Web Controls so controles que realizam alguma tarefa na pgina. Eles podem ter um comportamento bastante similar ao que estamos acostumados (por exemplo, uma caixa de texto), ou desempenhar um papel mais complexo (por exemplo, um calendrio). Os Web Controls so objetos do .NET Framework que possuem propriedades, eventos, mtodos, etc. Alm disso, esses objetos geram elementos HTML, scripts de cliente e estilos em CSS para poderem executar sua tarefa de acordo. Os Web Controles esto disponveis na aba Web da Toolbox. A seguir, estaremos discutindo alguns dos elementos principais.

Controles de ao Button System.Web.UI.WebControls.Button

O controle Button reconhecido como um boto que pode ser clicado. Voc utiliza o elemento Button quando voc quer que o usurio explicitamente solicite alguma ao da pgina. O evento de ao no boto (o clique) sempre faz com que a pgina realize uma requisio no servidor web. As propriedades principais de um boto indicam estilo (posicionamento, tamanho, cores, fontes, etc). Alm disso, a propriedade Text indica o texto que ser mostrado no boto. O principal evento de um Button Click. Este evento executado quando o boto clicado. Para visualizar melhor o uso de um controle Button, veja a seguinte listagem: Listagem 2.3: O controle Button

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 13

T u t o r i a l d e A S P. N E T

Arquivo Listagem02_03.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem2_3.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 24px" runat="server" Text="Button" Width="104px"></asp:Button> </form> </body> </HTML>

Listagem02_03.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem2_3 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here Button1.Text = "Clique me"; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); }
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 14

new

T u t o r i a l d e A S P. N E T

#endregion private void Button1_Click(object sender, System.EventArgs e) { Button1.Text = "Voc me clicou"; }

No cdigo da listagem 2.3, um controle Button colocado em uma pgina ASP.NET. O Visual Studio automaticamente cria o cdigo de design para o boto, configurando as propriedades de Style para o posicionamento, Width para a largura e Text para o texto do boto. <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 24px" runat="server" Text="Button" Width="104px"></asp:Button> Com ajuda da programao, fazemos uma alterao na propriedade Text dentro do mtodo de evento Load da pgina, com o cdigo: Button1.Text = "Clique me"; Tambm configuramos o evento de Click do boto para alterar o valor do texto do boto. private void Button1_Click(object sender, System.EventArgs e) { Button1.Text = "Voc me clicou"; } LinkButton

O controle LinkButton bastante semelhante ao Button. De fato, o evento principal de um LinkButton Click, assim como o Button. S que, diferente de Button, a aparncia de de um LinkButton a de um hyperlink. Quando clicado, o LinkButton ir forar uma requisio ao servidor e ir executar o mtodo do evento de Click. No utilize LinkButton para criar links entre pginas. Para hyperlinks, existe o controle HyperLink, visto mais tarde nesta lio. A principal propriedade de um LinkButton o Text. Um exemplo bastante simples que utiliza o controle LinkButton mostrado a seguir. Listagem 2.4: O controle LinkButton

Arquivo Listagem02_04.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_04.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript">

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 15

T u t o r i a l d e A S P. N E T

<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:LinkButton id="LinkButton1" style="Z-INDEX: 101; LEFT: 40px; POSITION: absolute; TOP: 40px" runat="server">Clique me</asp:LinkButton> </form> </body> </HTML>

Arquivo Listagem02_04.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_04 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.LinkButton LinkButton1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.LinkButton1.Click += System.EventHandler(this.LinkButton1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion e) private void LinkButton1_Click(object sender, System.EventArgs { } } LinkButton1.Text = "Voc me clicou";

new

ImageButton

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 16

T u t o r i a l d e A S P. N E T

Da mesma forma que os controles Button e LinkButton, o controle ImageButton pode ser clicado. Quando clicado, o controle fora uma requisio ao servidor Web e executa o mtodo Click do controle. ImageButton no possui uma propriedade Text. Ao contrrio, ela possui a propriedade ImageUrl, que indica a imagem a ser utilizada para o boto. Alm de ImageUrl, ImageButton possui as seguintes propriedades:

AlternateText: O texto que ser exibido se a imagem no estiver disponvel. Se o navegador suportar dicas de tela (tooltip), o texto mostrado como uma dica de tela. ImageAlign: Indica o alinhamento da imagem com os outros elementos da pgina.

O exemplo a seguir mostra como utilizar o ImageButton. Listagem 2.5: O controle ImageButton

Arquivo Listagem02_05.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_05.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:ImageButton id="ImageButton1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 24px" runat="server" ImageUrl="tecnomapas.gif"></asp:ImageButton> </form> </body> </HTML>

Arquivo Listagem02_05.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_05 { public class WebForm1 : System.Web.UI.Page {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 17

T u t o r i a l d e A S P. N E T

protected System.Web.UI.WebControls.ImageButton ImageButton1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here ImageButton1.AlternateText = "Clique neste boto"; ImageButton1.ImageAlign = ImageAlign.Middle; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.ImageButton1.Click += System.Web.UI.ImageClickEventHandler(this.ImageButton1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e) { ImageButton1.AlternateText = "Voc j clicou neste boto"; } } } Especificando comandos de aes Em algumas situaes de programao, possvel que voc tenha vrios controles de ao (Button, ImageButton ou LinkButton) em uma tela, e precise responder aos eventos de clique de todos eles. Voc pode criar um mtodo para responder os eventos Click de cada um dos controles, mas quando so muitos controles, possvel que seu cdigo se torne muito grande e complexo. Os controles de ao possuem uma caracterstica que reduz a complexidade do cdigo. Ele permite que voc crie apenas um mtodo para responder ao evento de ao do controle, e identifique que controle disparou o evento. Para isso, necessrio rotular o controle com uma string que represente o que o controle deve fazer. Isso feito atribuindo um valor para a propriedade CommandName do controle. possvel ainda especificar um valor para a propriedade CommandArgument, para especificar melhor o comando realizado pelo controle. Depois que voc especifica a propriedade CommandName, preciso encontrar um meio de identificar esta propriedade no momento de execuo do evento. Neste caso, voc precisa utilizar o evento Command do controle de ao. Este evento tambm disparado quando o usurio clica no controle, mas executado depois do evento de Click. A diferena entre Command e Click que o evento Command recebe como parmetro um objeto do tipo CommandEventArgs. Este objeto possui

new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 18

T u t o r i a l d e A S P. N E T

duas propriedades: CommandName identifica o rtulo de comando do controle que disparou o evento, e CommandArgument identifica seu argumento de comando. Assim, quando voc possui vrios controles de ao (botes, por exemplo) que realizam tarefas semelhantes, voc pode criar apenas um mtodo para gerenciar o evento de Command de todos eles, e no corpo do mtodo, identificar o CommandName e CommandArgument do controle para realizar a tarefa especfica. A listagem 2.6 mostra um exemplo que utiliza essa tcnica. Listagem 2.6: Utilizando o evento Command

Arquivo Listagem02_06.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_06.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Label id="Label1" style="Z-INDEX: 100; LEFT: 32px; POSITION: absolute; TOP: 16px" runat="server" Width="176px" BorderColor="Silver" FontNames="Lucida Console,Monospace" BorderStyle="Solid" BorderWidth="1px" Height="24px" Font-Size="Large" ForeColor="Black" BackColor="White">0</asp:Label> <asp:Button id="Button11" style="Z-INDEX: 112; LEFT: 104px; POSITION: absolute; TOP: 208px" accessKey="L" runat="server" Width="88px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="Limpar" BackColor="#E0E0E0" CommandName="Limpar"></asp:Button> <asp:Button id="Button10" style="Z-INDEX: 111; LEFT: 48px; POSITION: absolute; TOP: 208px" accessKey="0" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="0" BackColor="#E0E0E0" CommandArgument="0" CommandName="Numero"></asp:Button> <asp:Button id="Button9" style="Z-INDEX: 110; LEFT: 160px; POSITION: absolute; TOP: 64px" accessKey="9" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="9" BackColor="#E0E0E0" CommandArgument="9" CommandName="Numero"></asp:Button> <asp:Button id="Button8" style="Z-INDEX: 109; LEFT: 104px; POSITION: absolute; TOP: 64px" accessKey="8" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="8" BackColor="#E0E0E0" CommandArgument="8"

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 19

T u t o r i a l d e A S P. N E T

CommandName="Numero"></asp:Button> <asp:Button id="Button7" style="Z-INDEX: 108; LEFT: 48px; POSITION: absolute; TOP: 64px" accessKey="7" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="7" BackColor="#E0E0E0" CommandArgument="7" CommandName="Numero"></asp:Button> <asp:Button id="Button6" style="Z-INDEX: 107; LEFT: 160px; POSITION: absolute; TOP: 112px" accessKey="6" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="6" BackColor="#E0E0E0" CommandArgument="6" CommandName="Numero"></asp:Button> <asp:Button id="Button5" style="Z-INDEX: 106; LEFT: 104px; POSITION: absolute; TOP: 112px" accessKey="5" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="5" BackColor="#E0E0E0" CommandArgument="5" CommandName="Numero"></asp:Button> <asp:Button id="Button4" style="Z-INDEX: 105; LEFT: 48px; POSITION: absolute; TOP: 112px" accessKey="4" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="4" BackColor="#E0E0E0" CommandArgument="4" CommandName="Numero"></asp:Button> <asp:Button id="Button3" style="Z-INDEX: 104; LEFT: 160px; POSITION: absolute; TOP: 160px" accessKey="3" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="3" BackColor="#E0E0E0" CommandArgument="3" CommandName="Numero"></asp:Button> <asp:Button id="Button2" style="Z-INDEX: 103; LEFT: 104px; POSITION: absolute; TOP: 160px" accessKey="2" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="2" BackColor="#E0E0E0" CommandArgument="2" CommandName="Numero"></asp:Button> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 48px; POSITION: absolute; TOP: 160px" accessKey="1" runat="server" Width="32px" BorderColor="Silver" Font-Names="Lucida Console" BorderStyle="Solid" BorderWidth="1px" Height="32px" Font-Size="Medium" Text="1" BackColor="#E0E0E0" CommandArgument="1" CommandName="Numero"></asp:Button> </form> </body> </HTML>

Arquivo Listagem02_06.aspx.cs

using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 20

T u t o r i a l d e A S P. N E T

using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace Listagem02_06 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Button Button2; protected System.Web.UI.WebControls.Button Button3; protected System.Web.UI.WebControls.Button Button4; protected System.Web.UI.WebControls.Button Button5; protected System.Web.UI.WebControls.Button Button6; protected System.Web.UI.WebControls.Button Button7; protected System.Web.UI.WebControls.Button Button8; protected System.Web.UI.WebControls.Button Button9; protected System.Web.UI.WebControls.Button Button10; protected System.Web.UI.WebControls.Button Button11; protected System.Web.UI.WebControls.Label Label1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button2.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button3.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button4.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button5.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button6.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button7.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button8.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button9.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button10.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button11.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Command(object System.Web.UI.WebControls.CommandEventArgs e) { switch (e.CommandName)
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1

new new new new new new new new new new new

sender,

Pgina 21

T u t o r i a l d e A S P. N E T

e.CommandArgument; e.CommandArgument;

case "Numero": if (Label1.Text.Length < 8) { if (Label1.Text == "0") Label1.Text = else Label1.Text +=

(string) (string)

} break; case "Limpar": Label1.Text = "0"; break;

No exemplo da listagem 2.6, criado um Web Form com o formato de uma calculadora. Este Web Form possui 11 botes. 10 deles so botes que escrevem nmeros no display. O ltimo boto responsvel por zerar o valor do display. Os botes, neste caso, possuem tarefas bastante semelhantes: alteram o valor que aparece no display. Portanto, ao invs de criar um mtodo para cada o evento Click de cada um dos controles, criamos apenas um mtodo para o evento Command: private void Button1_Command(object sender, CommandEventArgs e) { switch (e.CommandName) { case "Numero": if (Label1.Text.Length < 8) { if (Label1.Text == "0") Label1.Text = (string)e.CommandArgument; else Label1.Text += (string)e.CommandArgument; } break; case "Limpar": Label1.Text = "0"; break; } } O mtodo Button1_Command() recebe como parmetro um objeto CommandEventArgs, e utilizamos este objeto para identificar o boto que disparou o evento, acessando a propriedade CommandName. switch (e.CommandName) Para identificar corretamente o boto, no entanto, precisamos tambm atribuir valores em todos os botes que recebem o evento de Command. Isso foi feito no editor da pgina, atribuindo o valor Numero para a propriedade CommandName dos botes de nmero, e o valor Limpar para o CommandName do boto de Limpar. No caso dos botes de nmero, foi especificado tambm a propriedade CommandArgument, indicando que nmero o boto representa.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 22

T u t o r i a l d e A S P. N E T

Ambas as propriedades CommandName e CommandArgument dos botes so passadas para o objeto CommandEventArgs, do mtodo Button1_Command(), e assim, podemos identificar corretamente o boto e realizar a tarefa mais adequada.

Controles de edio de dados TextBox

O TextBox talvez o controle mais utilizado para entrada de dados em formulrios Web. Ele utilizado para entrada de dados textuais, com uma linha, mltiplas linhas, ou senhas. O valor que o usurio escreveu na caixa de texto pode ser obtida atravs da propriedade Text do controle. Quando o usurio muda o valor da caixa de texto (muda a propriedade Text), o evento TextChanged disparado. Voc pode criar mtodos para tratar a mudana do valor do controle. Voc pode escolher quando o evento TextChanged ser executado alterando o valor da propriedade AutoPostBack. Se AutoPostBack for alterado para true, o evento disparado assim que o cursor de edio do usurio sai do controle. Neste caso, a pgina submetida para o servidor Web para que o mtodo do evento TextChanged seja executado. Se AutoPostBack estiver configurado como false, o mtodo do evento de TextChanged s executado quando o usurio clica em um controle de ao do Web Form. O controle TextBox tem vrias faces. Voc controla a forma como ele ir aparecer na pagina com a propriedade TextMode. TextMode pode assumir os valores TextMode.SingleLine, TextMode.MultiLine e TextMode.Password. Se TextMode estiver configurado como TextMode.SingleLine, o controle apresentado como um input do tipo text. Se estiver configurado como TextMode.MultiLine, o controle apresentado como um textarea. E se estiver configurado como TextMode.Password, o controle apresentado como um input do tipo password. A propriedade Rows indica quantas linhas sero visualizadas no controle com TextMode configurado como TextMode.MultiLine. Essa propriedade no tem efeito se voc configurar o valor de Height do controle. A propriedade ReadOnly trava o controle para edio. O usurio s vai conseguir selecionar texto, mas no poder alterar seu valor. A propriedade Enabled especifica se o controle estar funcional na pgina do cliente. Neste caso, o controle se torna somente leitura e ter uma aparncia esmaecida. A listagem 2.7 mostra um exemplo de como utilizar o controle TextBox. Listagem 2.7: O controle TextBox

Arquivo Listagem02_07.aspx
Documento: TIPX-1 Pgina 23

Cuiab, 23 de Agosto de 2005, 12:17

T u t o r i a l d e A S P. N E T

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_07.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server" Width="48px">Nome:</asp:Label> <asp:TextBox id="TextBox1" style="Z-INDEX: 102; LEFT: 88px; POSITION: absolute; TOP: 16px" runat="server" Width="304px"></asp:TextBox> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 48px" runat="server">Endereo:</asp:Label> <asp:TextBox id="TextBox2" style="Z-INDEX: 104; LEFT: 88px; POSITION: absolute; TOP: 48px" runat="server" Width="304px" TextMode="MultiLine" Height="104px" AutoPostBack="True"></asp:TextBox> <asp:Label id="Label3" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 160px" runat="server">Senha:</asp:Label> <asp:TextBox id="TextBox3" style="Z-INDEX: 106; LEFT: 88px; POSITION: absolute; TOP: 160px" runat="server" Width="160px" TextMode="Password" MaxLength="8"></asp:TextBox> <asp:Button id="Button1" style="Z-INDEX: 107; LEFT: 88px; POSITION: absolute; TOP: 192px" runat="server" Width="72px" Text="Enviar"></asp:Button> <asp:TextBox id="TextBox4" style="Z-INDEX: 108; LEFT: 408px; POSITION: absolute; TOP: 16px" runat="server" Width="304px" Enabled="False"></asp:TextBox> <asp:TextBox id="TextBox5" style="Z-INDEX: 109; LEFT: 408px; POSITION: absolute; TOP: 48px" runat="server" Width="304px" TextMode="MultiLine" Height="104px" ReadOnly="True"></asp:TextBox> <asp:TextBox id="TextBox6" style="Z-INDEX: 110; LEFT: 408px; POSITION: absolute; TOP: 160px" runat="server" Enabled="False" ReadOnly="True"></asp:TextBox> <asp:Label id="Label4" style="Z-INDEX: 111; LEFT: 720px; POSITION: absolute; TOP: 16px" runat="server"></asp:Label> <asp:Label id="Label5" style="Z-INDEX: 112; LEFT: 720px; POSITION: absolute; TOP: 48px" runat="server"></asp:Label> <asp:Label id="Label6" style="Z-INDEX: 113; LEFT: 728px; POSITION: absolute; TOP: 160px" runat="server"></asp:Label></form> </body> </HTML>

Arquivo Listagem02_07.aspx.cs

using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 24

T u t o r i a l d e A S P. N E T

using using using using using

System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_07 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.TextBox TextBox2; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.TextBox TextBox4; protected System.Web.UI.WebControls.TextBox TextBox5; protected System.Web.UI.WebControls.TextBox TextBox6; protected System.Web.UI.WebControls.Label Label4; protected System.Web.UI.WebControls.Label Label5; protected System.Web.UI.WebControls.Label Label6; protected System.Web.UI.WebControls.TextBox TextBox3; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here Label4.Text = ""; Label5.Text = ""; Label6.Text = ""; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.TextBox1.TextChanged += System.EventHandler(this.TextBox1_TextChanged); this.TextBox2.TextChanged += System.EventHandler(this.TextBox2_TextChanged); this.TextBox3.TextChanged += System.EventHandler(this.TextBox3_TextChanged); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { TextBox4.Text = TextBox1.Text; TextBox5.Text = TextBox2.Text; TextBox6.Text = TextBox3.Text; } private void TextBox1_TextChanged(object System.EventArgs e) { Label4.Text = "Texto mudou";
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1

new new new new

sender,

Pgina 25

T u t o r i a l d e A S P. N E T

} private void TextBox2_TextChanged(object System.EventArgs e) { Label5.Text = "Texto mudou"; } private void TextBox3_TextChanged(object System.EventArgs e) { Label6.Text = "Texto mudou"; } } } sender,

sender,

No exemplo acima, so definidas 6 caixas de texto. Quando o boto Enviar clicado, feito uma cpia dos valores das caixas da esquerda para a direita. Se algum valor da caixa foi alterado desde a ltima submisso, um aviso mostrado em tela. Isso feito porque configuramos o evento TextChanged de cada caixa de texto. Observe a mudana de comportamento de TextBox1, TextBox2 e TextBox3. Eles funcionam como input do tipo text, textarea e input do tipo password, respectivamente, graas a propriedade TextMode. No lado direito, foi feita uma combinao com as propriedades Enabled e ReadOnly, para mostrar o efeito dessas propriedades. CheckBox

O controle CheckBox representa uma caixa de checagem na pgina do usurio. Ela pode ser marcada ou desmarcada. Voc utiliza o controle CheckBox quando quer oferecer uma opo do tipo SIM/NO para o usurio. A propriedade que indica se o controle est marcado ou no Checked. Quando a propriedade Checked do controle muda de estado, o evento CheckedChanged disparado. Da mesma forma que o controle TextBox, voc pode cachear o evento de CheckedChanged para quando o usurio submeter os dados, configurando a propriedade AutoPostBack como false. Da mesma forma, voc pode configurar a propriedade AutoPostBack para true, e assim que o CheckBox clicado, a pgina submetida para o servidor. CheckBox tambm possui as propriedades Enabled e ReadOnly, e tem o mesmo comportamento que em TextBox. A listagem 2.8 mostra um exemplo com um controle CheckBox. Se o usurio marcar o controle e submeter a pgina, um aviso ser mostrado no controle Label da pgina. Listagem 2.8: O controle CheckBox

Arquivo Listagem02_08.aspx

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 26

T u t o r i a l d e A S P. N E T

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_08.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:CheckBox id="CheckBox1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 56px" tabIndex="4" runat="server" Text="Desejo receber informaes por email"></asp:CheckBox> <asp:TextBox id="TextBox1" style="Z-INDEX: 102; LEFT: 128px; POSITION: absolute; TOP: 16px" tabIndex="1" runat="server" Width="144px"></asp:TextBox> <asp:Label id="Label1" style="Z-INDEX: 104; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">E-mail</asp:Label> <asp:Button id="Button1" style="Z-INDEX: 108; LEFT: 96px; POSITION: absolute; TOP: 104px" tabIndex="5" runat="server" Text="Cadastrar" Width="88px"></asp:Button> <asp:Label id="Label4" style="Z-INDEX: 109; LEFT: 16px; POSITION: absolute; TOP: 144px" runat="server" Width="248px" ForeColor="Red"></asp:Label> </form> </body> </HTML>

Arquivo Listagem02_08.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_08 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.CheckBox CheckBox1; protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label4; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 27

T u t o r i a l d e A S P. N E T

Label4.Text = "";

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { if (CheckBox1.Checked && TextBox1.Text.Length > 0) Label4.Text = "Um e-mail de boas vindas foi }

new

enviado"; } }

RadioButton

O RadioButton um controle que oferece ao usurio uma opo que pode ser escolhida. Mas ao contrrio do CheckBox, o RadioButton normalmente utilizado em conjunto com vrios, para que o usurio escolha uma entre vrias opes. Da mesma forma que o CheckBox, voc pode verificar o estado marcado/desmarcado do controle RadioButton atravs da propriedade Checked. S que ao contrrio de CheckBox, voc no pode desmarcar um RadioButton clicando sobre ele novamente. Para desmarcar um RadioButton voc precisa selecionar outro RadioButton do mesmo grupo. Voc agrupa controles do tipo RadioButton utilizando a propriedade Group. Os controles com mesmo Group configurado sero auto-excludentes. RadioButton tambm possui uma propriedade CheckedChanged, que disparado quando o estado de marcado/desmarcado do controle muda. Voc pode configurar a propriedade AutoPostBack para executar o cdigo de evento assim que ele acontece, ou esperar pela submisso da pgina pelo usurio. ReadOnly faz com que controle no possa ser alterado. Enabled faz com que o controle aparea desabilitado no cliente, se for configurado como false. A listagem 2.9 mostra um exemplo que utiliza RadioButton. Listagem 2.9: O controle RadioButton

Arquivo Listagem02_09.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_09.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 28

T u t o r i a l d e A S P. N E T

<HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:RadioButton id="rbSexMasc" style="Z-INDEX: 101; LEFT: 40px; POSITION: absolute; TOP: 40px" runat="server" Text="Masculino" GroupName="Sexo"></asp:RadioButton> <asp:RadioButton id="rbSexFem" style="Z-INDEX: 102; LEFT: 40px; POSITION: absolute; TOP: 64px" runat="server" Text="Feminino" GroupName="Sexo" Width="88px"></asp:RadioButton> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Sexo:</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 104; LEFT: 24px; POSITION: absolute; TOP: 112px" runat="server">Idade:</asp:Label> <asp:RadioButton id="rbIdMenor" style="Z-INDEX: 105; LEFT: 40px; POSITION: absolute; TOP: 136px" runat="server" Text="Menor de 18" GroupName="Idade" Width="104px"></asp:RadioButton> <asp:RadioButton id="rbIdAdulto" style="Z-INDEX: 106; LEFT: 40px; POSITION: absolute; TOP: 160px" runat="server" Text="Entre 18 e 50" GroupName="Idade"></asp:RadioButton> <asp:RadioButton id="rbIdIdoso" style="Z-INDEX: 107; LEFT: 40px; POSITION: absolute; TOP: 184px" runat="server" Text="Maior de 50" GroupName="Idade" Width="104px"></asp:RadioButton> <asp:LinkButton id="LinkButton1" style="Z-INDEX: 108; LEFT: 24px; POSITION: absolute; TOP: 224px" runat="server">Enviar</asp:LinkButton> <asp:Label id="Label3" style="Z-INDEX: 109; LEFT: 56px; POSITION: absolute; TOP: 16px" runat="server"></asp:Label> <asp:Label id="Label4" style="Z-INDEX: 110; LEFT: 72px; POSITION: absolute; TOP: 112px" runat="server"></asp:Label> </form> </body> </HTML>

Arquivo Listagem02_09.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_09 { public class WebForm1 : System.Web.UI.Page {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 29

T u t o r i a l d e A S P. N E T

protected protected protected protected protected protected protected protected protected protected

System.Web.UI.WebControls.RadioButton rbSexMasc; System.Web.UI.WebControls.RadioButton rbSexFem; System.Web.UI.WebControls.Label Label2; System.Web.UI.WebControls.RadioButton rbIdMenor; System.Web.UI.WebControls.RadioButton rbIdAdulto; System.Web.UI.WebControls.RadioButton rbIdIdoso; System.Web.UI.WebControls.LinkButton LinkButton1; System.Web.UI.WebControls.Label Label3; System.Web.UI.WebControls.Label Label4; System.Web.UI.WebControls.Label Label1;

private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.LinkButton1.Click += System.EventHandler(this.LinkButton1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion e) private void LinkButton1_Click(object sender, System.EventArgs { if (rbSexFem.Checked) Label3.Text = rbSexFem.Text; else if (rbSexMasc.Checked) Label3.Text = rbSexMasc.Text; if (rbIdAdulto.Checked) Label4.Text = rbIdAdulto.Text; else if (rbIdIdoso.Checked) Label4.Text = rbIdIdoso.Text; else if (rbIdMenor.Checked) Label4.Text = rbIdMenor.Text;

new

A propriedade Group ajuda a separar os diferentes itens em grupos lgicos (Sexo e Idade). Voc pode notar no mtodo LinkButton1_Click() que a manipulao para avaliar se um controle est ou no marcado feita item a item. No h um mecanismo rpido para avaliar qual controle do grupo est marcado. Para ter essa facilidade, voc pode usar o controle RadioButtonList, explicado mais frente.

Controles de seleo

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 30

T u t o r i a l d e A S P. N E T

CheckBoxList

Se voc precisa mostrar uma coleo de controles CheckBox agrupados de alguma forma, voc pode utilizar o controle CheckBoxList. Este controle mostra uma lista de controles CheckBox que podem ser marcados e desmarcados. A principal propriedade de CheckBoxList Items, que uma coleo de controles CheckBox. Portanto, voc pode iterar nessa propriedade para saber o estado de marcado (Checked) de cada item. Voc pode adicionar e remover novos itens da forma que for necessrio, com os mtodos Add() e Remove() da propriedade Items. Voc pode modificar o layout do controle alterando as propriedades RepeatLayout, RepeatDirection e RepeatColumns. RepeatLayout indica como o controle ser criado em HTML, se com ajuda de tabelas (Table) ou sem tabelas (Flow). RepeatDirection indica se as opes sero mostradas no sentido horizontal (Horizontal) ou vertical (Vertical). Por fim, RepeatColumns indica em quantas colunas as opes estaro sendo mostradas. O principal evento de CheckBoxList SelectedIndexChanged. Ele disparado sempre que alguma opo da lista marcada ou desmarcada. A listagem 2.10 mostra um programa de exemplo com CheckBoxList. Listagem 2.10: O controle RadioButton

Arquivo Listagem02_10.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_10.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:CheckBoxList id="CheckBoxList1" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 48px" runat="server" Width="360px" RepeatColumns="2"> <asp:ListItem Value="P">Paraguai</asp:ListItem> <asp:ListItem Value="U">Uruguai</asp:ListItem> <asp:ListItem Value="E">Equador</asp:ListItem> <asp:ListItem Value="G">Guiana Francesa</asp:ListItem> </asp:CheckBoxList> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 24px; POSITION: absolute; TOP: 16px" runat="server">Quais dos pases abaixo no possuem fronteira com o oceano?</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 192px" runat="server"></asp:Label> <asp:Button id="Button1" style="Z-INDEX: 104; LEFT: 32px; POSITION: absolute; TOP: 160px" runat="server" Text="Responder"></asp:Button>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 31

T u t o r i a l d e A S P. N E T

</form> </body> </HTML>

Arquivo Listagem02_10.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_10 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.CheckBoxList CheckBoxList1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.CheckBoxList1.SelectedIndexChanged += System.EventHandler(this.CheckBoxList1_SelectedIndexChanged); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { if (CheckBoxList1.Items[0].Selected && CheckBoxList1.Items[1].Selected && !CheckBoxList1.Items[2].Selected && !CheckBoxList1.Items[3].Selected) Label2.Text = "Certa a resposta!"; else Label2.Text = "No, no isso."; } private void CheckBoxList1_SelectedIndexChanged(object sender, System.EventArgs e)

new new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 32

T u t o r i a l d e A S P. N E T

{ } }

Response.Write("Opa");

RadioButtonList

De forma semelhante a CheckBoxList, RadioButtonList representa uma lista de opes auto-excludentes. Se voc for trabalhar com grupos de RadioButton, esta a forma mais simples e recomendada. A principal propriedade de RadioButtonList Items, que uma coleo de objetos RadioButton. Voc pode adicionar e remover novas opes na lista a qualquer momento, utilizando os mtodos Add() e Remove() da propriedade Items. Voc pode iterar entre os elementos de Items a procura do item marcado, mas a forma mais simples utilizar a propriedade SelectedIndex ou SelectedItem do objeto RadioButtonList para descobrir qual elemento est marcado. SelectedIndex retorna a posio do elemento que est marcado; SelectedItem retorna o item (RadioButton) marcado. Voc pode modificar o layout do controle alterando as propriedades RepeatLayout, RepeatDirection e RepeatColumns. RepeatLayout indica como o controle ser criado em HTML, se com ajuda de tabelas (Table) ou sem tabelas (Flow). RepeatDirection indica se as opes sero mostradas no sentido horizontal (Horizontal) ou vertical (Vertical). Por fim, RepeatColumns indica em quantas colunas as opes estaro sendo mostradas. O principal evento de RadioButtonList SelectedIndexChanged. Ele disparado sempre que a opo selecionada da lista modificada. A listagem 2.11 mostra um programa de exemplo com RadioButtonList. Listagem 2.11: O controle RadioButtonList

Arquivo Listagem02_11.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_11.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 24px" runat="server">Qual a capital do Brasil?</asp:Label> <asp:RadioButtonList id="RadioButtonList1" style="ZINDEX: 102; LEFT: 24px; POSITION: absolute; TOP: 56px" runat="server" Width="152px">

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 33

T u t o r i a l d e A S P. N E T

<asp:ListItem Value="Bras&#237;lia">Bras&#237;lia</asp:ListItem> <asp:ListItem Value="S&#227;o Paulo">S&#227;o Paulo</asp:ListItem> <asp:ListItem Value="Buenos Aires">Buenos Aires</asp:ListItem> </asp:RadioButtonList> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 176px" runat="server"></asp:Label> <asp:Button id="Button1" style="Z-INDEX: 104; LEFT: 32px; POSITION: absolute; TOP: 144px" runat="server" Text="Responder"></asp:Button> </form> </body> </HTML>

Arquivo Listagem02_11.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_11 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.RadioButtonList RadioButtonList1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { if (RadioButtonList1.SelectedItem != null) {

new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 34

T u t o r i a l d e A S P. N E T

"Braslia")

if else } }

(RadioButtonList1.SelectedItem.Text Label2.Text = "Certa a resposta!"; Label2.Text = "No. No isso.";

==

DropDownList

O controle DropDownList oferece uma lista do tipo menu suspenso, para que o usurio possa selecionar uma opo. Funciona como o o RadioButtonList, mas mais compacto. A principal propriedade do controle DropDownList SelectedItem. Este uma referncia para o item da lista que foi selecionado. J a propriedade Items funciona como no RadioButtonList, onde possvel adicionar e remover itens conforme for necessrio. O seu principal evento SelectedItemChanged. Ele ativado quando a opo selecionada no controle muda. Voc pode executar o cdigo do evento assim que ele ocorre configurando AutoPostBack como true. Se no, o evento s disparado quando o usurio submete a pgina. A listagem 2.12 mostra um exemplo com DropDownList. Listagem 2.12: O controle DropDowList.

Arquivo Listagem02_12.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_12.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DropDownList id="ddlEstados" style="Z-INDEX: 101; LEFT: 96px; POSITION: absolute; TOP: 56px" runat="server" AutoPostBack="True"></asp:DropDownList> <asp:DropDownList id="ddlCidades" style="Z-INDEX: 102; LEFT: 96px; POSITION: absolute; TOP: 96px" runat="server"></asp:DropDownList> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 24px; POSITION: absolute; TOP: 56px" runat="server" Width="57">Estado:</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 104; LEFT: 24px; POSITION: absolute; TOP: 96px" runat="server" Width="57px">Cidade:</asp:Label>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 35

T u t o r i a l d e A S P. N E T

<asp:Button id="Button1" style="Z-INDEX: 105; LEFT: 24px; POSITION: absolute; TOP: 136px" runat="server" Text="Selecionar"></asp:Button> <asp:Label id="Label3" style="Z-INDEX: 106; LEFT: 32px; POSITION: absolute; TOP: 176px" runat="server"></asp:Label> </form> </body> </HTML>

Arquivo Listagem02_12.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_12 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.DropDownList ddlEstados; protected System.Web.UI.WebControls.DropDownList ddlCidades; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Label Label2; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here if (!IsPostBack) { CarregaEstados(); CarregaMunicipios(0); } } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.ddlEstados.SelectedIndexChanged += System.EventHandler(this.ddlEstados_SelectedIndexChanged); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void CarregaEstados() { ddlEstados.Items.Clear();

new new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 36

T u t o r i a l d e A S P. N E T

ddlEstados.Items.Add("Mato Grosso"); ddlEstados.Items.Add("Mato Grosso do Sul");

private void CarregaMunicipios(int indice) { ddlCidades.Items.Clear(); switch (indice) { case 0: ddlCidades.Items.Add("Cuiab"); ddlCidades.Items.Add("Vrzea Grande"); break; case 1: ddlCidades.Items.Add("Campo Grande"); ddlCidades.Items.Add("Navira"); break; } } private void ddlEstados_SelectedIndexChanged(object System.EventArgs e) { CarregaMunicipios(ddlEstados.SelectedIndex); } sender,

private void Button1_Click(object sender, System.EventArgs e) { Label3.Text = ddlEstados.SelectedItem.Text +" "+ ddlCidades.SelectedItem.Text; } } } Na listagem acima, h dois DropDownLists: ddlCidades e ddlEstados. No mtodo de carregamento da pgina (Page_Load()), os controles so carregados com valores iniciais. possvel saber se o usurio est requisitando a pgina pela primeira vez, utilizando a expresso if (!IsPostBack) Quando o usurio modifica a seleo de Estado, o evento SelectedIndexChanged do controle disparado e carrega ddlCidades com as cidades do estado correspondentes. ddlEstados est configurado com AutoPostBack como true, assim, logo que o usurio faz a escolha, a pgina realiza um recarregamento e preenche o controle ddlCidades. ListBox

O controle ListBox mais um controle que permite ao usurio selecionar opes de uma lista. ListBox aparece como um menu na tela, com as opes mostra. A propriedade Items d acesso coleo de items do ListBox. possvel adicionar e remover os itens em tempo de execuo. Cada item de Items do tipo ListItem. ListItem possui uma propriedade Selected que nos permite verificar se o item est ou no selecionado.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 37

T u t o r i a l d e A S P. N E T

O principal evento de ListBox SelectedIndexChanged. Ele disparado sempre que alguma opo da lista marcada ou desmarcada. A listagem 2.13 mostra um programa de exemplo com ListBox. Listagem 2.13: O controle ListBox

Arquivo Listagem02_13.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_13.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:ListBox id="lbDisponivel" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 96px" runat="server" Width="136px" Height="104px" SelectionMode="Multiple"> <asp:ListItem Value="Abacate">Abacate</asp:ListItem> <asp:ListItem Value="Banana">Banana</asp:ListItem> <asp:ListItem Value="Damasco">Damasco</asp:ListItem> <asp:ListItem Value="Ma&#231;&#227;">Ma&#231;&#227;</asp:ListItem> <asp:ListItem Value="P&#234;ra">P&#234;ra</asp:ListItem> <asp:ListItem Value="Tomate">Tomate</asp:ListItem> </asp:ListBox> <asp:ListBox id="lbSelecionado" style="Z-INDEX: 102; LEFT: 352px; POSITION: absolute; TOP: 96px" runat="server" Width="136px" Height="104px" SelectionMode="Multiple"></asp:ListBox> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 72px" runat="server">Frutas disponveis</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 104; LEFT: 24px; POSITION: absolute; TOP: 16px" runat="server">Quitanda eletrnica</asp:Label> <asp:Label id="Label3" style="Z-INDEX: 105; LEFT: 360px; POSITION: absolute; TOP: 72px" runat="server">Frutas a comprar</asp:Label> <asp:Button id="Button1" style="Z-INDEX: 106; LEFT: 200px; POSITION: absolute; TOP: 112px" runat="server" Text="Selecionar >>" Width="122"></asp:Button> <asp:Button id="Button2" style="Z-INDEX: 107; LEFT: 200px; POSITION: absolute; TOP: 144px" runat="server" Text="<< Remover" Width="122px"></asp:Button> </form> </body> </HTML>

Arquivo Listagem02_13.aspx.cs

using System;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 38

T u t o r i a l d e A S P. N E T

using using using using using using using using using

System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_13 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.ListBox lbDisponivel; protected System.Web.UI.WebControls.ListBox lbSelecionado; protected System.Web.UI.WebControls.Button Button2; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Button2.Click += System.EventHandler(this.Button2_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { lbSelecionado.Items.Clear(); foreach (ListItem i in lbDisponivel.Items) { if (i.Selected) lbSelecionado.Items.Add(i); } } private void Button2_Click(object sender, System.EventArgs e) { for (int i = 0; i<lbSelecionado.Items.Count; i++) { if (lbSelecionado.Items[i].Selected) lbSelecionado.Items.RemoveAt(i); } }

new new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 39

T u t o r i a l d e A S P. N E T

Controles variados Label

Voc j conhece o controle Label, caso venha acompanhando os exemplos at agora. Este controle permite que voc defina um local no layout para escrever texto. Voc pode definir estilos variados para um Label (mais sobre estilos na Lio a seguir). A principal propriedade Text. Em Text voc acessa o contedo que ser mostrado em tela. Label no possui nenhum evento especial. Image

O controle Image permite colocar uma imagem em uma pgina. O controle Image no possui nenhum evento caracterstico. A principal propriedade de Image ImageUrl, que indica o endereo da imagem a ser mostrada. Listagem 2.14: O controle Image

Arquivo Listagem02_14.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_14.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Image id="Image1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server" ImageUrl="westfall.jpg"></asp:Image> </form> </body> </HTML>

Arquivo Listagem02_14.aspx.cs

using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 40

T u t o r i a l d e A S P. N E T

using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace Listagem02_14 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Image Image1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

HyperLink

O controle HyperLink permite colocar links para outras pginas dentro de seu Web Form. Utilize o HyperLink no lugar de LinkButton para redirecionamento para outras pginas. As duas principais propriedades de HyperLink so: NavigateUrl: Indica o destino do link Target: Indica o frame onde o link ser aberto, utilizado quando voc possui um frameset A aparncia do link para o usurio pode ser configurado em duas propriedades: Text: Pode ser configurado para mostrar um texto a ser utilizado como link ImageUrl: Se configurado, mostra uma imagem escolhida como link A listagem 2.15 mostra um exemplo de HyperLink e suas diferenas com LinkButton. Listagem 2.15: O controle HyperLink

Arquivo Listagem02_15.aspx

<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_14.WebForm2" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD>
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 41

T u t o r i a l d e A S P. N E T

7.1">

<title>WebForm2</title> <meta name="GENERATOR" Content="Microsoft

Visual

Studio

.NET

<meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:HyperLink id="HyperLink1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 24px" runat="server" NavigateUrl="WebForm1.aspx">Isto um HyperLink</asp:HyperLink> <asp:LinkButton id="LinkButton1" style="Z-INDEX: 102; LEFT: 24px; POSITION: absolute; TOP: 56px" runat="server">Isto um LinkButton</asp:LinkButton> </form> </body> </HTML>

Arquivo Listagem02_15.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_14 { public class WebForm2 : System.Web.UI.Page { protected System.Web.UI.WebControls.HyperLink HyperLink1; protected System.Web.UI.WebControls.LinkButton LinkButton1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 42

T u t o r i a l d e A S P. N E T

Calendar

Calendar um exemplo de controle complexo, que gera um conjunto heterogneo de HTML e script de cliente para realizar sua tarefa. Calendar representa um calendrio. Ele mostrado como uma tabela contendo os dias do ms selecionado. possvel selecionar uma data clicando-se no dia. possvel tambm selecionar o ano e o ms. As principais propriedades de Calendar so:

DayNameFormat: Indica como o dia da semana ser mostrado. Valores possveis: Full, Short, FirstLetter, FirstTwoLetters FirstDayOfWeek: Indica qual o primeiro dia da semana (domingo, segunda, etc.) NextMonthText: O texto que ser mostrado como link para mudar para o prximo ms do calendrio. Padro: &gt; (>) NextMonthFormat: Indica o que ser mostrado como link para mudana de ms no calendrio. FullMonth mostra o nome completo do ms, ShortMonth mostra o nome do ms abreviado, CustomText mostra o contedo indicado na propriedade NextMonthText e PrevMonthText. S aparece se ShowNextPrevMonth estiver configurado para true PrevMonthText: O texto que ser mostrado como link para mudar para o ms anterior do calendrio. Padro: &lt; (<) SelectMonthText: Indica o texto que ser mostrado para selecionar o ms do calendrio. S aparece se SelectionMode estiver configurado para DayWeekMonth. Padro: &gt;&gt; (>>) ShowDayHeader: Mostra (true) ou esconde (false) os dias da semana no calendrio. Padro: true ShowGridLines: Mostra (true) ou esconde (false) as linhas da tabela do Calendrio. Padro: false ShowNextPrevMonth: Mostra (true) ou esconde (false) os links para mudana de ms no calendrio. Padro: true ShowTitle: Mostra (true) ou esconde (false) o ttulo do calendrio, contendo o nome do ms e os links de mudana de ms TitleFormat: Indica como ser mostrado o ttulo (nome do ms). Month mostra apenas o ms, MonthYear mostra o ms e ano SelectionMode: Indica o que poder ser selecionado. None faz com que selees no sejam permitidas. Day permite selecionar apenas um dia, DayWeek permite selecionar um dia ou uma semana, DayWeekMonth permite selecionar uma dia, uma semana ou um ms SelectedDate: Permite indicar uma data para iniciar selecionada VisibleDate: Permite marcar uma data para servir de referncia para o usurio

Calendar permite uma customizao maior de estilos. possvel customizar independentemente o estilos dos dias, do ttulo, dos links de ms, dos dias do ms que no est ativo, dos dias da semana, do dia selecionado, do dia atual e dos dias de fim de semana. Os principais eventos de Calendar so:

SelectionChanged: Disparado quando o usurio seleciona uma nova data no calendrio VisibleMonthChanged: Disparado quando o usurio muda o ms mostrado no calendrio

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 43

T u t o r i a l d e A S P. N E T

A listagem 2.16 mostra um calendrio em ao. Listagem 2.16: O controle Calendrio

Arquivo Listagem02_16.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem02_15.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Calendar id="Calendar1" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 24px" runat="server" Width="344px" SelectionMode="DayWeekMonth" VisibleDate="2005-08-03" SelectedDate="2005-08-09"> <TodayDayStyle BorderStyle="Solid"></TodayDayStyle> <DayStyle ForeColor="DimGray"></DayStyle> <DayHeaderStyle FontItalic="True"></DayHeaderStyle> <WeekendDayStyle ForeColor="#E0E0E0"></WeekendDayStyle> <OtherMonthDayStyle ForeColor="#E0E0E0"></OtherMonthDayStyle> </asp:Calendar> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 40px; POSITION: absolute; TOP: 248px" runat="server"></asp:Label> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 40px; POSITION: absolute; TOP: 280px" runat="server"></asp:Label> </form> </body> </HTML>

Arquivo Listagem02_16.aspx.cs

using using using using using using using using using using

System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Listagem02_15 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Calendar Calendar1;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 44

T u t o r i a l d e A S P. N E T

private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Calendar1.VisibleMonthChanged += new System.Web.UI.WebControls.MonthChangedEventHandler(this.Calendar1_VisibleMo nthChanged); this.Calendar1.SelectionChanged += new System.EventHandler(this.Calendar1_SelectionChanged); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Calendar1_SelectionChanged(object System.EventArgs e) { Label1.Text = "Dia selecionado: Calendar1.SelectedDate.ToString(); } private void Calendar1_VisibleMonthChanged(object System.Web.UI.WebControls.MonthChangedEventArgs e) { Label2.Text = "Ms selecionado: e.NewDate.Month.ToString(); } } } sender, "+

sender, "+

Sumrio Nesta lio, voc aprendeu a utilizar os controles de ASP.NET. Voc sabe que os controles de dividem em HTML Controls e Web Controls. Os HTML Controls so controles que tm uma estrutura parecida com os elementos de HTML que eles geram. J os Web Controls so controles mais complexos que integram funcionalidades extras.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 45

T u t o r i a l d e A S P. N E T

Lio 3: Trabalhando com estilos

ASP.NET possui um bom framework para estilos. Nesta lio, vamos ressaltar alguns pontos que auxiliam a configurar um estilo para as pginas que voc criar. Os objetivos desta lio so:

Entender a atuao das capacidades do navegador na gerao de HTML Aprender a modificar o layout de um Web Form Entender como o ASP.NET trata estilos Aprender a linkar arquivos CSS a Web Forms Utilizar corretamente os diferentes modos de aplicar estilos em Web Forms

Capacidades do navegador ASP.NET possui uma arquitetura que permite identificar o navegador do cliente que est requisitando a pgina. Dessa forma, o ASP.NET pode gerar HTML especfico para as capacidades do navegador. Por exemplo, as configuraes de posio de um TextBox pode ser configurada na propriedade style do elemento gerado, ou nas propriedades width e height. Isso vai depender se o navegador do cliente suporta CSS ou no. O ASP.NET detecta as capacidades do navegador atravs do User Agent do navegador. O User Agent uma string enviada pelo navegador como cabealho de toda requisio que ele faz. Por exemplo, o Internet Explorer verso 6.0 SP1, em um Windows Xp com Service Pack 2 e .NET Framework 1.1, envia um User Agent dessa forma: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) Com as informaes enviadas no User Agent, o ASP.NET pode detectar as capacidades, e envia o resultado da deteco para a pgina e os controles, que vo gerar o HTML de acordo com esse resultado. Se voc sabe quais so os seus clientes, talvez voc queira evitar a deteco automtica, fazendo com que o a pgina e seus controles gerem HTML para um tipo especfico de navegador (na verdade, capacidades). O ASP.NET permite que voc selecione as capacidades de navegador com a propriedade clientTarget, do Web Form. Em clientTarget voc especifica um alias. O ASP.NET define 4 aliases que voc pode colocar em clientTarget, a saber:

ie5

Suporta frames Suporta tabelas Suporta cookies Suporta sons de fundo Suporta vbscript e javascript (1.2) Suporta applets Java e controles ActiveX Microsoft DOM verso 5.5 DOM W3C verso 1.0 Suporta CSS 1.0 e CSS 2.0

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 46

T u t o r i a l d e A S P. N E T

Suporta XML

ie4

Suporta frames Suporta tabelas Suporta cookies Suporta sons de fundo Suporta vbscript e javascript (1.2) Suporta applets Java e controles ActiveX Microsoft DOM verso 4.0 No suporta DOM W3C Suporta CSS 1.0, mas no CSS 2.0 No suporta XML

uplevel Igual a ie4 downlevel No suporta No suporta No suporta No suporta No suporta No suporta No suporta No suporta No suporta No suporta frames tabelas cookies sons de fundo vbscript ou javascript applets Java ou controles ActiveX Microsoft DOM DOM W3C CSS XML

O programa da listagem 3.1 mostra um Web Form que mostra as capacidades do navegador. Se voc configurar clientTarget como vazio, o ASP.NET detecta automaticamente as capacidades do navegador do cliente. No entanto, se voc configurar clientTarget para um dos valores de alias mostrados acima, as capacidades detectadas do navegador sero as mesmas, no importando o navegador do cliente. Isso til para situaes onde voc sabe qual o requisito mnimo de navegadores, ou para nivelar as capacidades. O ASP.NET no perfeito para detectar qualquer tipo de navegador. A Microsoft decidiu criar um arquivo que faz a configurao de acordo com o User Agent, ao invs de utilizar um servio on-line. O preo disso que este arquivo no est sendo atualizado, e novos navegadores no esto sendo corretamente detectados. Por exemplo, as verses novas de Firefox, Safari, Konqueror e Mozilla suportam XML, CSS e DOM, mas o ASP.NET no consegue detectar. A soluo mais correta atualizar o arquivo machine.config na mquina onde rodar a aplicao. Outra sada configurar clientTarget para um nvel mais alto, como ie5. Isso alivia as diferenas, uma vez que ie5 possui XML, CSS e DOM da W3C, mas pode gerar problemas, uma vez que inclui tambm o DOM da Microsoft. No programa da listagem 3.1 mostrado um Web Form que apresenta as configuraes de navegador detectadas pelo servidor ASP.NET. Sinta-se vontade para brincar um pouco com o Web Form. Acesse o Web Form com diferentes navegadores e veja como ele trata cada um. Modifique o valor de clientTarget para verificar como as configurapes detectadas permanecem imutveis. Listagem 3.1: Capacidades do navegador

Arquivo Listagem03_01.aspx
Documento: TIPX-1 Pgina 47

Cuiab, 23 de Agosto de 2005, 12:17

T u t o r i a l d e A S P. N E T

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem03_01.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </head> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> </form> </body> </html>

Arquivo Listagem03_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Listagem03_01 { public class WebForm1 : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here Response.Write("UserAgent: "); Response.Write(Request.UserAgent+"<br>"); Response.Write("AcceptTypes: "); for (int i=0;i<Request.AcceptTypes.Length; i++) Response.Write(Request.AcceptTypes[i]+" "); Response.Write("<br>"); Response.Write("ActiveXControls: "); Response.Write(Request.Browser.ActiveXControls.ToString()+"<br>"); Response.Write("AOL: "); Response.Write(Request.Browser.AOL.ToString()+"<br>"); Response.Write("BackgroundSounds: "); Response.Write(Request.Browser.BackgroundSounds.ToString()+"<br>"); Response.Write("Beta: "); Response.Write(Request.Browser.Beta.ToString()+"<br>"); Response.Write("Browser: "); Response.Write(Request.Browser.Browser.ToString()+"<br>"); Response.Write("CDF: "); Response.Write(Request.Browser.CDF.ToString()+"<br>"); Response.Write("ClrVersion: "); Response.Write(Request.Browser.ClrVersion.ToString()+"<br>");

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 48

T u t o r i a l d e A S P. N E T

Response.Write("Cookies: "); Response.Write(Request.Browser.Cookies.ToString()+"<br>"); Response.Write("Crawler: "); Response.Write(Request.Browser.Crawler.ToString()+"<br>"); Response.Write("EcmaScriptVersion: "); Response.Write(Request.Browser.EcmaScriptVersion.ToString()+"<br>"); Response.Write("Frames: "); Response.Write(Request.Browser.Frames.ToString()+"<br>"); Response.Write("JavaApplets: "); Response.Write(Request.Browser.JavaApplets.ToString()+"<br>"); Response.Write("JavaScript: "); Response.Write(Request.Browser.JavaScript.ToString()+"<br>"); Response.Write("MajorVersion: "); Response.Write(Request.Browser.MajorVersion.ToString()+"<br>"); Response.Write("MinorVersion: "); Response.Write(Request.Browser.MinorVersion.ToString()+"<br>"); Response.Write("MSDomVersion: "); Response.Write(Request.Browser.MSDomVersion.ToString()+"<br>"); Response.Write("Platform: "); Response.Write(Request.Browser.Platform.ToString()+"<br>"); Response.Write("Tables: "); Response.Write(Request.Browser.Tables.ToString()+"<br>"); Response.Write("Platform: "); Response.Write(Request.Browser.Platform.ToString()+"<br>"); Response.Write("TagWriter: "); Response.Write(Request.Browser.TagWriter.ToString()+"<br>"); Response.Write("Type: "); Response.Write(Request.Browser.Type.ToString()+"<br>"); Response.Write("VBScript: "); Response.Write(Request.Browser.VBScript.ToString()+"<br>"); Response.Write("Version: "); Response.Write(Request.Browser.Version.ToString()+"<br>"); Response.Write("W3CDomVersion: "); Response.Write(Request.Browser.W3CDomVersion.ToString()+"<br>"); Response.Write("Win16: "); Response.Write(Request.Browser.Win16.ToString()+"<br>"); Response.Write("Win32: "); Response.Write(Request.Browser.Win32.ToString()+"<br>"); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() {
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 49

T u t o r i a l d e A S P. N E T

this.Load += new System.EventHandler(this.Page_Load); } #endregion

Layout da pgina Como voc provavelmente j observou, o editor do Visual Studio para Web Forms muito semelhante a editores de interface grfica para programas desktop. O posicionamento de controles feito arrastando-se os controles na pgina. Essa uma boa abordagem para quem experiente em interfaces desktop, alm de facilitar a construo do layout da pgina. No entanto, quem est acostumado com webdesign constri o layout da pgina com ajuda de tabelas e elementos div/span. possvel, com ASP.NET, utilizar essa abordagem. Ela chamada de layout de fluxo. Para escolher entre o mtodo de layout posicionado e o layout de fluxo, modifique a propriedade pageLayout da pgina. Ele aceita uma de duas opes. GridLayout modifica o estilo de layout da pgina para posicionado. FlowLayout modifica o estilo de layout para fluxo. Quando configurado para modo FlowLayout, as informaes de Top e Left para os controles se tornam inoperantes. O uso de FlowLayout permite a programao do layout da pgina bem similar ao de editores de pgina como o DreamWeaver ou FrontPage. A listagem 3.2 mostra um Web Form com layout do tipo FlowLayout. Listagem 3.2: Uso de FlowLayout

Arquivo Listagem03_02.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Listagem03_02.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body> <form id="Form1" method="post" runat="server"> <TABLE id="Table1" style="WIDTH: 616px; HEIGHT: 160px" cellSpacing="1" cellPadding="1" width="616" border="0"> <TR> <TD align="center" colSpan="2">Teste de Layout</TD> </TR> <TR> <TD style="WIDTH: 94px">Nome:</TD> <TD>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 50

T u t o r i a l d e A S P. N E T

<asp:TextBox id="TextBox1" runat="server" Width="100%"></asp:TextBox></TD> </TR> <TR> <TD style="WIDTH: 94px">Idade:</TD> <TD> <asp:TextBox id="TextBox2" runat="server" Width="100%"></asp:TextBox></TD> </TR> <TR> <td colspan="2" align="center"> <asp:Button id="Button1" runat="server" Width="97px" Text="Enviar"></asp:Button></td> </TR> </TABLE> </form> </body> </HTML>

Arquivo Listagem03_02.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Listagem03_02 { public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.TextBox TextBox2; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

Uso de Panels
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 51

T u t o r i a l d e A S P. N E T

Para facilitar alguns casos de layout, voc pode querer utilizar Panels. Panels so controles que podem armazenar e mostrar um ou mais controles. Ao colocar controles dentro de Panels, possvel agrupar controles que devem se comportar em conjunto. Por exemplo, uma parte do layout deve ser escondida quando um CheckBox marcado. Voc pode criar um mtodo que configure a propriedade Visible do Panel para false quando o CheckBox marcado. Existem vrios tipos de Panels em ASP.NET. O primeiro um Web Control chamado Panel (encontrado na aba Web Forms da Toolbox). Ele, como todo Web Control, altamente configurvel via servidor. O contedo do controle Panel organizado por fluxo. Os outros dois so HTML Controls, encontrados na aba HTML da Toolbox. So eles o Flow Layout Panel e Grid Layout Panel. Embora tenham nomes diferentes, tratam-se do mesmo elemento, DIV, e so mapeados para o objeto HtmlGenericControl, se a sua propriedade runat estiver configurada para server. A diferena entre Flow Layout Panel e Grid Layout Panel que o primeiro permite organizar seu layout interno com tabelas, e o segundo permite organizar seu layout interno atravs de posicionamento direto dos controles. Voc utilizar o Web Control Panel quando voc quiser maior controle de suas caractersticas via programao de servidor. Por exemplo, se voc precisar configurar sua Visible para esconder ou mostrar um conjunto de controles. No entanto, ele indesejado se voc preferir o uso de layout por posio. Voc usar o HTML Control HtmlGenericControl quando no precisar programar muito em servidor. Ele fornece uma maneira rpida de criar layout sem sobrecarregar o servidor e o desenvolvimento. No entanto, completamente possvel trabalhar com HTML controls quando utilizar a propriedade runat configurada como server. Alm disso, ele oferece a possibilidade de se escolher entre o layout por fluxo ou posicionado. A listagem 3.3 mostra um Web Form que utiliza Panels para flexibilizar a interface de um cadastro de pessoa. Listagem 3.3: Uso de Panels

Arquivo Listagem03_03.aspx

<%@ Page language="c#" Codebehind="Listagem03_03.aspx.cs" AutoEventWireup="false" Inherits="Listagem03_01.Listagem03_03" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem03_03</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 16px" runat="server" Width="160px" AutoPostBack="True"> <asp:ListItem Value="Jur&#237;dica">Jur&#237;dica</asp:ListItem>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 52

T u t o r i a l d e A S P. N E T

<asp:ListItem Value="F&#237;sica">F&#237;sica</asp:ListItem> </asp:DropDownList> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Pessoa:</asp:Label> <DIV style="Z-INDEX: 103; LEFT: 8px; WIDTH: 376px; POSITION: absolute; TOP: 48px; HEIGHT: 144px" ms_positioning="FlowLayout"> <asp:Panel id="PanelFisica" runat="server" Width="368px" Height="48px" Visible="False"> <TABLE id="Table1" cellSpacing="1" cellPadding="1" width="100%" border="0"> <TR> <TD style="WIDTH: 63px">Nome:</TD> <TD> <asp:TextBox id="Nome" runat="server" Width="100%"></asp:TextBox></TD> </TR> <TR> <TD style="WIDTH: 63px">CPF:</TD> <TD> <asp:TextBox id="Cpf" runat="server" Width="100%"></asp:TextBox></TD> </TR> </TABLE> </asp:Panel> <asp:Panel id="PanelJuridica" runat="server" Width="368px" Height="40px"> <TABLE id="Table2" cellSpacing="1" cellPadding="1" width="100%" border="0"> <TR> <TD style="WIDTH: 95px">Razo Social:</TD> <TD> <asp:TextBox id="RazaoSocial" runat="server" Width="100%"></asp:TextBox></TD> </TR> <TR> <TD style="WIDTH: 95px">CNPJ:</TD> <TD> <asp:TextBox id="Cnpj" runat="server" Width="100%"></asp:TextBox></TD> </TR> </TABLE> </asp:Panel></DIV> </form> </body> </HTML>

Arquivo Listagem03_03.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Listagem03_01 {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 53

T u t o r i a l d e A S P. N E T

public class Listagem03_03 : System.Web.UI.Page { protected System.Web.UI.WebControls.DropDownList DropDownList1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.TextBox Nome; protected System.Web.UI.WebControls.TextBox Cpf; protected System.Web.UI.WebControls.TextBox RazaoSocial; protected System.Web.UI.WebControls.Panel PanelFisica; protected System.Web.UI.WebControls.Panel PanelJuridica; protected System.Web.UI.WebControls.TextBox Cnpj; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.DropDownList1.SelectedIndexChanged += System.EventHandler(this.DropDownList1_SelectedIndexChanged); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { if (DropDownList1.SelectedItem.Text == "Fsica") { PanelFisica.Visible = true; PanelJuridica.Visible = false; } else { PanelJuridica.Visible = true; PanelFisica.Visible = false; } } }

new

Estilos em .NET Voc define os estilos dos controles que voc utiliza em uma pgina de duas formas: 1. Utilizando CSS diretamente, seja atravs da propriedade style ou uso de classes 2. Utilizando as propriedades do controle relacionadas a estilo. Essa tcnica s utilizado em Web Controls Todos os elementos de pgina de ASP.NET possuem suporte a CSS (Cascading Style Sheets). Voc pode configurar propriedades CSS de vrias formas:

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 54

T u t o r i a l d e A S P. N E T

Configurando a propriedade class dos HTML Controls, ou o correspondente CssClass dos Web Controls Configurando a propriedade style dos HTML Controls Configurando a propriedade Style dos Web Controls

Adicionando arquivos CSS ao projeto A maioria dos webdesigners utiliza arquivos com a configurao de estilos em CSS para dar estilo s suas pginas. Isso permite centralizar as configuraes de estilos, separando ASP.NET tambm permite fazer isso. Antes de relacionar um arquivo CSS ao seu Web Form, preciso inclu-lo no projeto. Isso pode ser feito de duas formas: incluindo um arquivo existente ou criando um novo arquivo CSS no seu projeto. Depois de adicionado o arquivo CSS ao projeto, provavelmente voc ir querer edit-lo para criar os estilos ou alterar os existentes. O Visual Studio oferece um editor de CSS textual para aqueles que possuem proficincia em CSS, e um editor grfico para aqueles que preferem ferramentas automatizadas. Quando estiver editando um arquivo CSS, uma nova barra de ferramentas ir aparecer no lado esquerdo da interface de desenvolvimento. L estaro presentes os estilos configurados naquele arquivo, agrupados por:

Elements: Estilos associados a um elemento. Os elementos herdaro automaticamente os estilos configurados para ele no arquivo CSS linkado com a pgina Classes: Estilos agrupados em classes. Para que algum elemento herde os estilos configurados para uma classe, preciso configurar explicitamente a propriedade class ou CssClass do controle para usar a classe de estilos configurada no arquivo CSS Element Ids: Estilos associados a um ID. Os elementos herdaro automaticamente os estilos se possurem ID igual a um dos estilos configurados no arquivo CSS @ Blocks: Regras de estilos. Utilizados em vrios cenrios, como, por exemplo, modificar o estilo dependendo do mdia que ser usa para visualizar a pgina

Para criar um novo estilo, basta editar o arquivo diretamente ou clicar com o boto direito sobre uma das categorias de estilo e em Add Style Rule... Da mesma forma, para editar um estilo existente, ou se edita o arquivo diretamente, ou basta escolher Build Style... no menu de contexto do estilo desejado para abrir o editor grfico. Depois de editado e salvo, voc ir querer relacionar o arquivo de CSS a um Web Form. Para isso, com o Web Form aberto, selecione o item Document Styles no menu Format. Abre-se a janela Document Styles. Selecione o documento ao qual voc quer linkar e clique no boto Add Style Link. Selecione o arquivo CSS. A partir deste momento, os estilos j sero aplicados ao seu documento. Voc poder tambm referenciar classes CSS nos elementos desejados. O atributo Style Todos os controles (HTML ou Web) possuem um propriedade Style. Todas elas so programveis da mesma forma. Style do tipo CssStyleCollection, que armazena uma quantidade de estilos na forma de par chave-valor. Voc pode configurar os estilos da seguinte forma: Label lbl = new Label(); lbl.Style[background-color] = #CF262F;
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 55

T u t o r i a l d e A S P. N E T

Os estilos configurados sero impressos em HTML como itens da propriedade style do elemento gerado pelo controle. As propriedades de controles Todos os controles derivados de WebControl possuem algumas propriedades de estilo. So elas:

BackColor: configura a cor de fundo do controle. Normalmente a cor predominante do controle. do tipo Color. O padro Color.Empty. BorderColor: configura a cor de borda do controle. do tipo Color. O padro Color.Empty. BorderStyle: configura o estilo da borda do controle. do tipo BorderStyle. O padro BorderStyle.NotSet. BorderWidth: configura a largura de borda do controle. do tipo Unit. O padro Unit.Empty. Font: configura a fonte utilizada no controle (nome, negrito, itlico, sublinhado, riscado e tamanho). do tipo FontInfo. ForeColor: configura a cor de frente do controle. Normalmente a cor do texto no controle. do tipo Color. O padro Color.Empty. Height: configura a altura do controle. do tipo Unit. O padro Unit.Empty. Width: configura a largura do controle. do tipo Unit. O padro Unit.Empty.

Voc no tem controle direto sobre como os estilos configurados em propriedades dos Web Controls sero gerados em HTML. Por exemplo, a propriedade BackColor pode ser gerada como o item background-color da propriedade style do controle, mas apenas se o navegador suportar HTML 4.0 e CSS. Se o navegador no suportar estes padres, possvel que o elemento fique sem cor de fundo, ou em alguns casos, gerada uma tabela para dar a cor de fundo (tabelas suportam cor de fundo desde as primeiras verses de HTML). Escolhendo que tipo de estilo utilizar Qual tipo de configurao escolher para sua pgina? Para responder a essa pergunta, preciso entender como os navegadores interpretam os estilos CSS. A W3C diz no padro HTML que os navegadores precisam implementar herana entre os estilos. Isso quer dizer que, quando mais de um estilo aplicado a um elemento, o navegador precisa definir prioridades entre os estilos. Se, por exemplo, background-color definido em um class e na propriedade style, s pode haver um background-color aplicado no final. A ordem de herana varia de propriedade CSS para propriedade CSS (algumas propriedades simplesmente no podem ser herdadas), e principalmente de navegador para navegador. De modo geral, os navegadores hoje tem um bom entendimento que os estilos CSS devem sempre sobrepor s configuraes setadas para um elemento com as propriedades do elemento. Por exemplo, alguns elementos de HTML possuem as propriedades width e height. Por sua vez, tambm existem as propriedades CSS width e height. Se um elemento (por exemplo, um object) possui configurada a propriedade width tanto em CSS (atravs de classes ou pelo atributo style) quanto no prprio elemento (atravs do atributo width do elemento object), o valor configurado via CSS que tm a preferncia. Focando apenas em CSS, existe uma regra de prioridade para saber qual estilo ser aplicado dependendo de qual seja a origem do CSS. A maioria dos navegadores, na maioria dos casos, daro preferncia ao estilo definido no atributo style do elemento, em
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 56

T u t o r i a l d e A S P. N E T

relevncia a um estilo conflitante definido em um class. Por exemplo, se a propriedade de estilo width for definido em um style do elemento, e o mesmo elemento herdar um class que tambm tenha width configurado, o navegador ir dar preferncia pelo estilo inline (atributo style). Por causa desses comportamento dos navegadores, preciso projetar a forma como voc vai distribuir os estilos entre as diferentes fontes. Algumas idias podem ajudar a voc nesta tarefa:

Arquivos CSS: os arquivos CSS linkados aos Web Forms so interessantes principalmente porque desoneram o tamanho dos arquivos HTML. Alm disso constituem uma forma mais lgica de separar apresentao (CSS) de contedo (HTML). Voc pode criar estilos nestes arquivos utilizando quaisquer das categorias explicadas acima (Elements, Classes, Ids ou @ Blocks). Utilizar arquivos de CSS til quando voc quer disponibilizar ao usurio a escolha do estilo que ele quer utilizar na pgina. Alguns navegadores modernos, como o Firefox, oferecem a opo de o usurio visualizar a pgina com os diferentes arquivos de estilos mostrados pelo usurio. Utilize estilos configurados em arquivos de CSS principalmente para cores, fontes e tamanhos em geral. Estilos inline (atributo style do elemento): Os atributos style so importantes porque eles so a maior prioridade na hora de renderizar uma pgina. Utilize estilos inline para as propriedades de estilo que voc no pretende mudar. Uma coisa que voc normalmente no vai permitir alguma alterao o posicionamento de elementos na pgina. Atributos dos elementos: Isso no serve para Web Controls. Quanto mais for possvel, no utilize os atributos que configuram estilos dos elementos. A W3C pretende que voc d preferncia aos atributos CSS. Os atributos CSS so mais elegantes, genricos, lgicos e modernos. Utilize os atributos dos elementos de estilo apenas para nivelar por baixo uma funcionalidade que voc quer que aparea. Propriedades de Web Controls: So teis porque seguem o padro de deteco do ASP.NET. Assim, bem provvel que a configurao para um atributo seja renderizado no importa qual seja o navegador. Existem excees, porm. No certo que o ASP.NET v reconhecer corretamente o navegador. Se voc precisar de uma programao menos limitada de estilos, talvez voc queira utilizar as propriedades do controle no preciso prever todas as classes de estilos possveis para programar uma funcionalidade. Se voc quiser mais controle de como os estilos esto sendo renderizados, ou souber quais so seus clientes, utilize CSS.

Sumrio Nesta lio, voc aprendeu como tratar de estilos com ASP.NET. Descobriu que o ASP.NET faz a deteco automtica das capacidades do navegador, e como possvel fixar um cliente alvo para a renderizao. Voc agora sabe como escolher entre os mtodos de layout e como o uso de Panels pode auxiliar na criao de Web Forms dinmicos. Voc sabe como o ASP.NET trata CSS e como voc pode configurar estilos no seu Web Form.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 57

T u t o r i a l d e A S P. N E T

Lio 4: Validao de dados

Essa lio mostra o que so e como usar os controles de validao. Os objetivos especficos so:

Aprender o que so controles de validao Mostrar as funcionalidades dos controles de validao de ASP.NET

Introduo A validao de dados uma parte integrante da arquitetura ASP.NET. O ASP.NET fornece controles de validao para validar entrada de usurio. Estes controles so ligados aos controles que fazem a entrada de dados (um TextBox, por exemplo), mas so independentes destes. O Framework .NET fornece 5 controles de validao padro, mas possvel customizar os existentes com cdigo para funcionar da forma que seja necessria. A execuo da validao nestes controles feita normalmente no servidor. No servidor, a validao ocorre logo aps a inicializao da pgina (aps os dados de envio terem sido carregados), mas antes que os eventos dos controles da pgina sejam chamados. Se DHTML estiver disponvel no cliente (inclui MS DOM e JScript), a validao feita no cliente tambm. Neste caso, a validao ocorre assim que o usurio deixa o controle a ser validado. Isso permite respostas mais rpidas ao usurio. O pgina gerada tambm ter referncias para bibliotecas de script do Framework que fazem a validao. Os controles de ao (como Button e LinkButton) possuem uma propriedade chamada CausesValidation. Se CausesValidation tiver valor false e o usurio clica nele, os dados no so validados. Se CausesValidation estiver configurado como true, os dados so validados no cliente e/ou no servidor.

Os controles de validao Todos os controles de validao so criados a partir da classe BaseValidator. BaseValidator possui trs propriedades principais, a seguir:

ControlToValidate: Ela indica qual o controle de dados ser validado pelo controle de validao. Display: Configura o mtodo de como a mensagem de erro ser mostrada para o usurio. do tipo ValidatorDisplay. Se estiver configurada para Static, o espao para a mensagem alocada na pgina. Se configurado para Dinamic, o a mensagem alocada dinamicamente quando o erro de validao for disparado. Se configurado para None, a mensagem de erro no ser mostrada no local do controle de validao. EnableClientScript: Se configurada para true (padro), ser gerado script de cliente para validar os dados no cliente. Assim, os dados podem ser validados sem que uma submisso seja executada. Se configurada para false, a validao ser realizada apenas no lado do servidor. ErrorMessage: Mensagem de erro que ser mostrada para o cliente quando ocorrer um erro de validao.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 58

T u t o r i a l d e A S P. N E T

IsValid: Indica se o controle de dados associado passou na validao.

Os controles de validao existentes no Framework so 5: RequiredFieldValidator Faz com que o usurio no pule o preenchimento de um campo. Todos os outros controles por definio validam como correto a entrada vazia. Utilize este controle se no este o comportamento que voc espera para a entrada.

CompareValidator Compara a entrada do usurio com um valor constante ou com a propriedade de outro controle usando operadores de comparao (<, =, >, etc.). Utilize a propriedade ValueToCompare para comparar com valores constantes, ou ControlToCompare para comparar com o valor de outro controle. Em Type definido o tipo de dados dos operandos, e em Operator definido o operador a ser utilizado na comparao. Se as propriedades ValueToCompare e ControlToCompare no estiverem definidas, apenas a validao de tipo de dados realizada. Neste caso, utilize o valor DataTypeCheck para a propriedade Operator.

RangeValidator Checa se a entrada do usurio est entre dois valores. Esses valores podem ser nmeros, datas ou caracteres alfabticos.

RegularExpressionValidator Checa a entrada do usurio com um padro especificado por uma expresso regular.

CustomValidator Checa a entrada do usurio com cdigo escrito pelo desenvolvedor. Por exemplo, possvel realizar checagem do valor com um banco de dados para validar o campo. Neste caso, preciso definir o evento ServerValidate do controle CustomValidator. Para validao no cliente, preciso configurar a propriedade ClientValidationFunction com a funo de script utilizada para validar. Obviamente, preciso que esta funo esteja disponvel ao elemento em tempo de execuo.

Para criar funes de validao prprias no servidor, preciso escrever uma funo para o evento ServerValidate do objeto CustomValidator. O evento passa um objeto ServerValidateEventArgs, que deve ser configurado como vlido ou no dependendo do resultado da validao. A propriedade IsValid do objeto ServerValidateEventArgs indica se a validao passou ou no. Por exemplo, para limitar o tamanho da entrada do usurio, uma funo para ServerValidate pode ser igual a: protected void TextValidate(object source, ServerValidateEventArgs args) { args.IsValid = (args.Value.Length <= 8); } Para escrever validao via script de cliente, uma abordagem parecida deve ser tomada. Primeiro, necessrio escrever a funo em script de cliente. Essa funo precisa receber dois parmetros. O primeiro parmetro recebe a referncia para o objeto que lanou o evento, e o outro recebe argumentos especficos do evento. Por exemplo, para validar o tamanho da entrada do usurio no cliente, pode ser usada essa funo: <SCRIPT LANGUAGE="JavaScript"> function validateLength(oSrc, args){ args.IsValid = (args.Value.length <= 8); } </SCRIPT>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 59

T u t o r i a l d e A S P. N E T

possvel notar a semelhana no modelo de objetos entre as duas abordagens. Depois de criado o script de validao, preciso configurar a propriedade ClientValidationFunction de CustomValidator com o ttulo da funo de script. possvel ligar um controle de entrada de dados a mais de um controle de validao. Por exemplo, possvel ligar um TextBox a um controle RequiredFieldValidator e RangeValidator. possvel desabilitar, em tempo de execuo ou design, a validao de um controle. Para isso, basta setar a propriedade CausesValidation do controle a ser validado para false. Para habilitar a validao apenas no servidor, configure a propriedade EnableClientScript do controle validador para false. Cada controle possui uma mensagem de texto que pode ser mostrada caso a validao seja invlida. possvel formatar o estilo da mensagem da forma que convier, com os mesmos atributos do objeto Label. possvel, caso desejado, mostrar um sumrio de erros de validao na pgina. Isto feito pelo controle ValidationSummary. Ele no pode ser disparado por script de cliente como os componentes validadores, mas interessante porque pode disparar uma caixa de texto contendo as mensagens de validao de todos os controles de validao presentes na pgina. A listagem 4.1 mostra um programa que utiliza algumas das funcionalidades de validao. Listagem 4.1: Controles de validao

Arquivo Listagem04_01.aspx

<%@ Page language="c#" Codebehind="Listagem04_01.aspx.cs" AutoEventWireup="false" Inherits="Licao04.Listagem04_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem04_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <SCRIPT LANGUAGE="JavaScript"> function validateLength(oSrc, args){ args.IsValid = (args.Value.length <= 8); } </SCRIPT> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 48px" runat="server"></asp:TextBox> <asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 48px; POSITION: absolute; TOP: 392px" runat="server" Text="Valida"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 24px" runat="server">Texto que no pode ser vazio</asp:Label>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 60

T u t o r i a l d e A S P. N E T

<asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 104; LEFT: 184px; POSITION: absolute; TOP: 48px" runat="server" ErrorMessage="Texto no pode ser vazio" ControlToValidate="TextBox1"></asp:RequiredFieldValidator> <asp:Label id="Label2" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 96px" runat="server">Nmero que precisa ser maior que 10</asp:Label> <asp:CompareValidator id="CompareValidator1" style="ZINDEX: 106; LEFT: 184px; POSITION: absolute; TOP: 120px" runat="server" ErrorMessage="Nmero precisa ser maior que 10" ControlToValidate="TextBox2" Operator="GreaterThan" Type="Integer" ValueToCompare="10"></asp:CompareValidator> <asp:RangeValidator id="RangeValidator1" style="Z-INDEX: 107; LEFT: 184px; POSITION: absolute; TOP: 184px" runat="server" ErrorMessage="Nmero entre 10 e 20" ControlToValidate="TextBox3" Type="Integer" MaximumValue="20" MinimumValue="10"></asp:RangeValidator> <asp:RegularExpressionValidator id="RegularExpressionValidator1" style="Z-INDEX: 108; LEFT: 192px; POSITION: absolute; TOP: 256px" runat="server" ErrorMessage="No email" ControlToValidate="TextBox4" ValidationExpression="\w+([-+.]\w+)*@\w+([.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator> <asp:CustomValidator id="CustomValidator1" style="ZINDEX: 109; LEFT: 192px; POSITION: absolute; TOP: 328px" runat="server" ErrorMessage="Texto ultrapassa limite" ControlToValidate="TextBox5" ClientValidationFunction="validateLength"></asp:CustomValidator> <asp:TextBox id="TextBox2" style="Z-INDEX: 110; LEFT: 24px; POSITION: absolute; TOP: 120px" runat="server"></asp:TextBox> <asp:TextBox id="TextBox3" style="Z-INDEX: 111; LEFT: 24px; POSITION: absolute; TOP: 184px" runat="server"></asp:TextBox> <asp:Label id="Label3" style="Z-INDEX: 112; LEFT: 16px; POSITION: absolute; TOP: 160px" runat="server">Valor precisa estar entre 10 e 20</asp:Label> <asp:TextBox id="TextBox4" style="Z-INDEX: 113; LEFT: 24px; POSITION: absolute; TOP: 256px" runat="server"></asp:TextBox> <asp:Label id="Label4" style="Z-INDEX: 114; LEFT: 16px; POSITION: absolute; TOP: 232px" runat="server">Valor precisa ser email</asp:Label> <asp:Label id="Label5" style="Z-INDEX: 115; LEFT: 16px; POSITION: absolute; TOP: 304px" runat="server">Tamanho do texto no pode ser maior que 8</asp:Label> <asp:TextBox id="TextBox5" style="Z-INDEX: 116; LEFT: 24px; POSITION: absolute; TOP: 328px" runat="server"></asp:TextBox> <asp:Button id="Button2" style="Z-INDEX: 117; LEFT: 152px; POSITION: absolute; TOP: 392px" runat="server" Text="No valida" CausesValidation="False"></asp:Button> </form> </body> </HTML>

Arquivo Listagem04_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI;

using using using using using using using using

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 61

T u t o r i a l d e A S P. N E T

using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace Licao04 { public class Listagem04_01 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.CompareValidator CompareValidator1; protected System.Web.UI.WebControls.RangeValidator RangeValidator1; protected System.Web.UI.WebControls.RegularExpressionValidator RegularExpressionValidator1; protected System.Web.UI.WebControls.CustomValidator CustomValidator1; protected System.Web.UI.WebControls.TextBox TextBox2; protected System.Web.UI.WebControls.TextBox TextBox3; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.TextBox TextBox4; protected System.Web.UI.WebControls.Label Label4; protected System.Web.UI.WebControls.Label Label5; protected System.Web.UI.WebControls.TextBox TextBox5; protected System.Web.UI.WebControls.Button Button2; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.CustomValidator1.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.CustomValidator1_ ServerValidate); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void CustomValidator1_ServerValidate(object System.Web.UI.WebControls.ServerValidateEventArgs args) { args.IsValid = (args.Value.Length <= 8); } } } source,

Sumrio

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 62

T u t o r i a l d e A S P. N E T

Nesta lio voc aprendeu que ASP.NET possui controles de validao. Eles so separados dos controles que querem validar, e, portanto, possuem maior flexibilidade. Os controles de validao cobrem alguns casos mais comuns, mas voc pode utilizar a validao que precisar.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 63

T u t o r i a l d e A S P. N E T

Lio 5: Acesso a bancos de dados

Esta lio recapitula algumas das informaes sobre acesso a banco de dados em .NET, e mostra como ADO.NET pode ser incorporado a ASP.NET. Os objetivos especficos so os seguintes:

Relembrar os componentes de ADO.NET para acesso a bancos de dados Entender o que bind de controles Conhecer os controles DataGrid e DataList

Relembrando ADO.NET ADO.NET uma estrutura de acesso a fontes de dados criada pela Microsoft e integrante do Framework .NET. Ela permite o acesso a dados no importando onde esteja esses dados. A arquitetura de ADO.NET dividida em trs camadas:

O Data Provider: So os componentes (drivers de acesso, classes, interfaces) utilizados para a comunicao com a fonte de dados. Normalmente quem escreve o Data Provider a empresa que fez a fonte de dados, mas a Framework .NET possui alguns Data Providers comuns j integrados (SQL Server, Access, Oracle, ODBC). Nesta camada esto as classes derivadas de IConnection, ICommand, IDataReader, e IDataAdapter. A camada de dados: So os componentes que representam os dados na arquitetura. Elas no referenciam as fontes de onde os dados provm, mas podem ser enviados para uma fonte, ou obtidos de uma, quando necessrio. Nesta camada esto as classes DataSet, DataTable, DataRelation, DataRow e DataColumn. A camada de apresentao: So componentes utilizados para interao com o usurio. Eles mostram uma representao dos dados contidos em DataSets e DataTables. No Framework .NET temos controles de apresentao em Windows Forms e ASP.NET. Em ASP.NET, os principais controles de apresentao de dados so DataList e DataGrid.

Basicamente, voc utiliza um objeto IConnection (como o OracleConnection) para se conectar a uma fonte de dados. Este objeto essencial para que o cdigo saiba com que fonte de dados voc est se comunicando. Voc se comunica com a fonte de dados utilizando um objeto ICommand (como o OracleCommand). Este objeto utilizado para enviar comandos para a fonte de dados e receber respostas deles. Voc pode utilizar estes objetos diretamente ou indiretamente, atravs de objetos IDataAdapters. Com o ICommand, voc pode obter um conjuntos de dados que so mapeados em um objeto IDataReader. Um objeto IDataReader (como o OracleDataReader) a abstrao de um ponteiro de cursor de banco de dados, somente-leitura e com apenas uma direo de leitura. Ele prov acesso rpido e sem sobrecarga para um conjunto de dados que no precisam de edio. Alternativamente, possvel trabalhar com dados desconectados. Dessa forma, voc obtm um conjunto inicial de dados, faz as alteraes necessrias (adio de novos itens, remoo e atualizao de itens existentes), e submete as alteraes de volta fonte de dados. O objeto primrio que permite esse tipo de comportamento DataSet. DataSet uma abstrao para um conjunto de DataTables. DataTable quem possui os dados,

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 64

T u t o r i a l d e A S P. N E T

organizados em DataColumns e DataRows. possvel criar relaes entre as DataTables com DataRelations. Para fazer a ponte entre DataSets e as fontes de dados, utiliza-se objetos IDataAdapter (como OracleDataAdapter). Eles possuem objetos de comando para fazer o preenchimento de DataSet e a atualizao da fonte de dados.

Visualizando os dados de banco de dados muito simples apresentar dados provenientes de uma fonte de dados. Voc pode utilizar os controles de pgina para apresentar dados. Por exemplo, em uma edio de cliente, voc pode utilizar os controles que j conhece (TextBox, Checkbox, DropDownList) para apresentar os dados de cliente. Isso til para quando temos apenas um item de registro para mostrar. O programa mostrado na listagem 5.1 mostra um bom exemplo de consultas a banco de dados. Ele apresenta uma listagem de nomes de emails dos empregados cadastrados no esquema hr. Quando voc muda o nome apresentado no controle DropDownList, a pgina recarregada. Isso acontece porque o controle tem sua propriedade AutoPostBack configurada em true. Para construir uma pgina assim, preciso, antes de mais nada, criar uma conexo com o banco de dados. Para isso, criamos um objeto OracleConnection durante o carregamento da pgina, e fechamos a conexo quando a pgina descarrega. Este um dos modos de se criar uma conexo (mas no o melhor). Essa tcnica interessante porque todos os controles podem ter a certeza de que uma conexo est aberta para poder buscar dados do banco. Voc ir notar que no h blocos para tratamento de exceo no cdigo. Isso foi feito para simplificar a compreenso do exemplo, mas em um cdigo de produo voc vai querer tratar toda exceo que puder ocorrer. Este o cdigo utilizado para criar a conexo: private void Page_Load(object sender, System.EventArgs e) { conn = new OracleConnection("Server=apisora2; Password=hr"); conn.Open(); (...)

User

Id=hr;

O cdigo para fechar a conexo s escrito no procedimento do evento de UnLoad da pgina: private void Listagem05_01_Unload(object sender, System.EventArgs e) { conn.Close(); } Queremos que, quando o usurio abre a pgina pela primeira vez, o DropDownList com os emails dos funcionrios seja preenchido. Podemos fazer isso no evento de Load da pgina, mas precisamos ter certeza que ele s seja preenchido na primeira vez que a pgina seja aberta. Ou seja, se o usurio realizar uma tarefa de Postback (enviar dados para o servidor e o servidor responder com a mesma pgina), o DropDownList no precisa ser repreenchido, porque o ASP.NET mantm os dados de todos os controles.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 65

T u t o r i a l d e A S P. N E T

Assim, verificamos, no mtodo de Load, se o usurio est abrindo a pgina, e carregamos o contedo da DropDownList, com o seguinte cdigo: if (!IsPostBack) { comm = new OracleCommand("select email from hr.employees order by email", conn); OracleDataReader dr = comm.ExecuteReader(); while (dr.Read()) DropDownList1.Items.Add(dr["email"].ToString()); CarregaFuncionario(DropDownList1.SelectedValue); } CarregaFuncionario() um mtodo da pgina que facilita o carregamento de dados da pgina. Quando a pgina mostrada, precisamos mostrar tambm os dados do funcionrio selecionado na DropDownList. CarregaFuncionario() implementado desta forma: private void CarregaFuncionario(string email) { comm = new OracleCommand("select first_name, last_name, hire_date, salary from hr.employees where email = :email", conn); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["email"].Value = email; OracleDataReader dr = comm.ExecuteReader(); if (dr.Read()) { txtNome.Text = dr["first_name"].ToString() +" "+ dr["last_name"].ToString(); txtContrata.Text = ((DateTime) dr["hire_date"]).ToString("d"); txtSalario.Text = ((decimal) dr["salary"]).ToString("N"); } } Quando o usurio selecionar um email na DropDownList, o sistema deve carregar os dados de um empregado. Por isso, implementamos o evento de SelectedIndexChanged para o DropDownList para carregar os dados do empregado nas caixas de texto da pgina: private void DropDownList1_SelectedIndexChanged(object System.EventArgs e) { CarregaFuncionario(DropDownList1.SelectedValue); } O programa inteiro pode ser visto na listagem 5.1: Listagem 5.1: Obteno de dados em ASP.NET

sender,

Arquivo Listagem05_01.aspx

<%@ Page language="c#" Codebehind="Listagem05_01.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#">
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 66

T u t o r i a l d e A S P. N E T

<meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 104px; POSITION: absolute; TOP: 16px" runat="server" Width="136px" AutoPostBack="True"></asp:DropDownList> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Funcionrios:</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 72px" runat="server">Nome:</asp:Label> <asp:Label id="Label3" style="Z-INDEX: 104; LEFT: 16px; POSITION: absolute; TOP: 104px" runat="server">Data de contratao</asp:Label> <asp:Label id="Label4" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 136px" runat="server">Salrio</asp:Label> <asp:TextBox id="txtNome" style="Z-INDEX: 106; LEFT: 72px; POSITION: absolute; TOP: 72px" runat="server" Width="216px" ReadOnly="True"></asp:TextBox> <asp:TextBox id="txtContrata" style="Z-INDEX: 107; LEFT: 152px; POSITION: absolute; TOP: 104px" runat="server" Width="137" ReadOnly="True"></asp:TextBox> <asp:TextBox id="txtSalario" style="Z-INDEX: 108; LEFT: 151px; POSITION: absolute; TOP: 136px" runat="server" Width="137px" ReadOnly="True"></asp:TextBox> </form> </body> </HTML>

Arquivo Listagem05_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls; System.Data.OracleClient;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_01 : System.Web.UI.Page { protected OracleConnection conn; protected System.Web.UI.WebControls.DropDownList DropDownList1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Label Label4; protected System.Web.UI.WebControls.TextBox txtNome; protected System.Web.UI.WebControls.TextBox txtContrata; protected System.Web.UI.WebControls.TextBox txtSalario; protected OracleCommand comm; private void Page_Load(object sender, System.EventArgs e)

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 67

T u t o r i a l d e A S P. N E T

conn = new OracleConnection("Server=apisora2.tecnorede.mt;User Id=hr;Password=hr"); conn.Open(); if (!IsPostBack) { comm = new OracleCommand("select email hr.employees order by email", conn); OracleDataReader dr = comm.ExecuteReader(); while (dr.Read())

from

DropDownList1.Items.Add(dr["email"].ToString()); CarregaFuncionario(DropDownList1.SelectedValue); } } private void CarregaFuncionario(string email) { comm = new OracleCommand("select first_name, last_name, hire_date, salary from hr.employees where email = :email", conn); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["email"].Value = email; OracleDataReader dr = comm.ExecuteReader(); if (dr.Read()) { txtNome.Text = dr["first_name"].ToString() +" "+ dr["last_name"].ToString(); txtContrata.Text = ((DateTime) dr["hire_date"]).ToString("d"); txtSalario.Text = ((decimal) dr["salary"]).ToString("N"); } } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.DropDownList1.SelectedIndexChanged += System.EventHandler(this.DropDownList1_SelectedIndexChanged); this.Unload += System.EventHandler(this.Listagem05_01_Unload); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void System.EventArgs e) { conn.Close(); } Listagem05_01_Unload(object sender,

new new

private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { CarregaFuncionario(DropDownList1.SelectedValue);


Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 68

T u t o r i a l d e A S P. N E T

Atualizando dados do banco Voc pode inserir ou atualizar dados em banco de dados Oracle utilizando o objeto OracleCommand. Os dados so provenientes dos controles da pgina. O exemplo da listagem 5.2 mostra o programa anterior ligeiramente alterado para atualizar informaes do empregado. Note que os controles de texto agora esto desbloqueados, e o usurio pode alterar a vontade. Para salvar as alteraes, basta clicar no boto Salvar. O boto Salvar possui o seguinte cdigo: private void Button1_Click(object sender, System.EventArgs e) { comm = new OracleCommand("update hr.employees set first_name = :fn, last_name = :ln, hire_date = :hd, salary = :s where email = :email", conn); comm.Parameters.Add("fn", OracleType.VarChar); comm.Parameters.Add("ln", OracleType.VarChar); comm.Parameters.Add("hd", OracleType.DateTime); comm.Parameters.Add("s", OracleType.Double); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["fn"].Value = txtNome.Text; comm.Parameters["ln"].Value = txtSobrenome.Text; comm.Parameters["hd"].Value = DateTime.Parse(txtContrata.Text); comm.Parameters["s"].Value = double.Parse(txtSalario.Text); comm.Parameters["email"].Value = DropDownList1.SelectedValue; try {

} catch (Exception ex) { lblMensagem.Text = ex.Message; }

comm.ExecuteNonQuery(); lblMensagem.Text = "Dados atualizados";

Note que um objeto OracleCommand criado no incio do mtodo. O objeto conn j foi inicializado no mtodo de Load da pgina, portanto, seguro utiliz-lo aqui. So definidos alguns parmetros para o comando e o comando executado dentro de um bloco de tratamento de exceo. Veja o programa na ntegra na listagem 5.2. Voc perceber que, alm dos controles de texto, foram colocados mais alguns controles de validao para validar a entrada do usurio. Listagem 5.2: Atualizando dados com ASP.NET

Arquivo Listagem05_02.aspx

<%@ Page language="c#" Codebehind="Listagem05_02.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_02" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_02</title>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 69

T u t o r i a l d e A S P. N E T

7.1">

<meta

name="GENERATOR"

Content="Microsoft

Visual

Studio

.NET

<meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 104px; POSITION: absolute; TOP: 16px" runat="server" Width="136px" AutoPostBack="True"></asp:DropDownList> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Funcionrios:</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 72px" runat="server">Nome:</asp:Label> <asp:Label id="Label3" style="Z-INDEX: 104; LEFT: 16px; POSITION: absolute; TOP: 144px" runat="server">Data de contratao</asp:Label> <asp:Label id="Label4" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 168px" runat="server">Salrio</asp:Label> <asp:TextBox id="txtNome" style="Z-INDEX: 106; LEFT: 96px; POSITION: absolute; TOP: 72px" runat="server" Width="193px"></asp:TextBox> <asp:TextBox id="txtContrata" style="Z-INDEX: 107; LEFT: 152px; POSITION: absolute; TOP: 144px" runat="server" Width="137"></asp:TextBox> <asp:TextBox id="txtSalario" style="Z-INDEX: 108; LEFT: 151px; POSITION: absolute; TOP: 168px" runat="server" Width="137px"></asp:TextBox> <asp:Label id="Label5" style="Z-INDEX: 109; LEFT: 16px; POSITION: absolute; TOP: 96px" runat="server">Sobrenome</asp:Label> <asp:TextBox id="txtSobrenome" style="Z-INDEX: 110; LEFT: 96px; POSITION: absolute; TOP: 96px" runat="server" Width="189px"></asp:TextBox> <asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 111; LEFT: 304px; POSITION: absolute; TOP: 168px" runat="server" ErrorMessage="*" ControlToValidate="txtSalario"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator2" style="Z-INDEX: 112; LEFT: 304px; POSITION: absolute; TOP: 144px" runat="server" ErrorMessage="*" ControlToValidate="txtContrata"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator3" style="Z-INDEX: 113; LEFT: 304px; POSITION: absolute; TOP: 104px" runat="server" ErrorMessage="*" ControlToValidate="txtSobrenome"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator4" style="Z-INDEX: 114; LEFT: 304px; POSITION: absolute; TOP: 72px" runat="server" ErrorMessage="*" ControlToValidate="txtNome"></asp:RequiredFieldValidator> <asp:CompareValidator id="CompareValidator1" style="ZINDEX: 115; LEFT: 320px; POSITION: absolute; TOP: 168px" runat="server" ErrorMessage="Valores positivos apenas" ControlToValidate="txtSalario" Type="Double" ValueToCompare="0" Operator="GreaterThan"></asp:CompareValidator> <asp:CompareValidator id="CompareValidator2" style="ZINDEX: 116; LEFT: 320px; POSITION: absolute; TOP: 144px" runat="server" ErrorMessage="Datas apenas" ControlToValidate="txtContrata" Type="Date" Operator="DataTypeCheck"></asp:CompareValidator> <asp:Button id="Button1" style="Z-INDEX: 117; LEFT: 112px; POSITION: absolute; TOP: 216px" runat="server"
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 70

T u t o r i a l d e A S P. N E T

Width="72px" Text="Salvar"></asp:Button> <asp:Label id="lblMensagem" style="Z-INDEX: 118; 16px; POSITION: absolute; TOP: 248px" runat="server"></asp:Label> </form> </body> </HTML>

LEFT:

Arquivo Listagem05_02.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_02 : System.Web.UI.Page { protected OracleConnection conn; protected OracleCommand comm; protected System.Web.UI.WebControls.DropDownList DropDownList1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Label Label4; protected System.Web.UI.WebControls.TextBox txtNome; protected System.Web.UI.WebControls.TextBox txtContrata; protected System.Web.UI.WebControls.Label Label5; protected System.Web.UI.WebControls.TextBox txtSobrenome; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator3; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator4; protected System.Web.UI.WebControls.CompareValidator CompareValidator1; protected System.Web.UI.WebControls.CompareValidator CompareValidator2; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label lblMensagem; protected System.Web.UI.WebControls.TextBox txtSalario; private void Page_Load(object sender, System.EventArgs e) { conn = OracleConnection("Server=apisora2.tecnorede.mt;User Id=fsomalia;Password=654321"); conn.Open(); if (!IsPostBack) { comm = new hr.employees order by email", conn);

new

OracleCommand("select

email

from

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 71

T u t o r i a l d e A S P. N E T

OracleDataReader dr = comm.ExecuteReader(); while (dr.Read()) DropDownList1.Items.Add(dr["email"].ToString()); CarregaFuncionario(DropDownList1.SelectedValue); } } private void CarregaFuncionario(string email) { comm = new OracleCommand("select first_name, last_name, hire_date, salary from hr.employees where email = :email", conn); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["email"].Value = email; OracleDataReader dr = comm.ExecuteReader(); if (dr.Read()) { txtNome.Text = dr["first_name"].ToString(); txtSobrenome.Text = dr["last_name"].ToString(); txtContrata.Text = ((DateTime) dr["hire_date"]).ToString("d"); txtSalario.Text = ((decimal) dr["salary"]).ToString("N"); } dr.Close(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.DropDownList1.SelectedIndexChanged += System.EventHandler(this.DropDownList1_SelectedIndexChanged); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Unload += System.EventHandler(this.Listagem05_02_Unload); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { CarregaFuncionario(DropDownList1.SelectedValue); } private void System.EventArgs e) { conn.Close(); } Listagem05_02_Unload(object sender,

new new new

private void Button1_Click(object sender, System.EventArgs e) {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 72

T u t o r i a l d e A S P. N E T

comm = new OracleCommand("update hr.employees set first_name = :fn, last_name = :ln, hire_date = :hd, salary = :s where email = :email", conn); comm.Parameters.Add("fn", OracleType.VarChar); comm.Parameters.Add("ln", OracleType.VarChar); comm.Parameters.Add("hd", OracleType.DateTime); comm.Parameters.Add("s", OracleType.Double); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["fn"].Value = txtNome.Text; comm.Parameters["ln"].Value = txtSobrenome.Text; comm.Parameters["hd"].Value = DateTime.Parse(txtContrata.Text); comm.Parameters["s"].Value = double.Parse(txtSalario.Text); comm.Parameters["email"].Value = DropDownList1.SelectedValue; try {

} catch (Exception ex) { lblMensagem.Text = ex.Message; }

comm.ExecuteNonQuery(); lblMensagem.Text = "Dados atualizados";

Utilizando dados desconectados Ao invs de utilizar o objeto OracleDataReader para preencher listas, voc pode utilizar um objeto DataSet. A vantagem de se utilizar DataSets que a programao de preenchimento da lista fica mais simples, devido tarefa de binding. Binding o ato de associar um controle visual da pgina com um conjunto de dados como o DataSet. Voc sabe como preencher um DataSet com dados. Normalmente, voc obtm os dados de um banco de dados Oracle com o objeto OracleDataAdapter, e utiliza o mtodo Fill() de OracleDataAdapter() para preencher o DataSet. Para preencher uma lista (como DropDownList) com dados de um DataSet, preciso dois comandos: 1. Atribuir a propriedade DataSource da lista com o objeto DataSet j preenchido 2. Executar o mtodo DataBind() da lista para fazer a ligao entre os dados e a visualizao. Portanto, podemos alterar o programa da listagem 5.2, quanto ao preenchimento do elemento DropDownList, desta forma: if (!IsPostBack) { OracleDataAdapter adpt = new hr.employees order by email", conn); try {

OracleDataAdapter("select

email

from

DataSet ds = new DataSet();

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 73

T u t o r i a l d e A S P. N E T

adpt.Fill(ds, "Employees"); DropDownList1.DataSource = ds; DropDownList1.DataBind(); CarregaFuncionario(DropDownList1.SelectedValue);

} catch {}

Voc pode notar que, ao invs de utilizar um OracleDataReader e ler linha por linha para preencher o DropDownList, podemos utilizar um DataSet e realizar o bind do controle. Listagem 5.3: Utilizando binding de dados

Arquivo Listagem05_03.aspx

<%@ Page language="c#" Codebehind="Listagem05_02.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_02" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_02</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 104px; POSITION: absolute; TOP: 16px" runat="server" Width="136px" AutoPostBack="True"></asp:DropDownList> <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Funcionrios:</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 72px" runat="server">Nome:</asp:Label> <asp:Label id="Label3" style="Z-INDEX: 104; LEFT: 16px; POSITION: absolute; TOP: 144px" runat="server">Data de contratao</asp:Label> <asp:Label id="Label4" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 168px" runat="server">Salrio</asp:Label> <asp:TextBox id="txtNome" style="Z-INDEX: 106; LEFT: 96px; POSITION: absolute; TOP: 72px" runat="server" Width="193px"></asp:TextBox> <asp:TextBox id="txtContrata" style="Z-INDEX: 107; LEFT: 152px; POSITION: absolute; TOP: 144px" runat="server" Width="137"></asp:TextBox> <asp:TextBox id="txtSalario" style="Z-INDEX: 108; LEFT: 151px; POSITION: absolute; TOP: 168px" runat="server" Width="137px"></asp:TextBox> <asp:Label id="Label5" style="Z-INDEX: 109; LEFT: 16px; POSITION: absolute; TOP: 96px" runat="server">Sobrenome</asp:Label> <asp:TextBox id="txtSobrenome" style="Z-INDEX: 110; LEFT: 96px; POSITION: absolute; TOP: 96px" runat="server" Width="189px"></asp:TextBox> <asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 111; LEFT: 304px; POSITION: absolute; TOP: 168px" runat="server" ErrorMessage="*" ControlToValidate="txtSalario"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator2" style="Z-INDEX: 112; LEFT: 304px; POSITION: absolute; TOP: 144px"
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 74

T u t o r i a l d e A S P. N E T

runat="server" ErrorMessage="*" ControlToValidate="txtContrata"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator3" style="Z-INDEX: 113; LEFT: 304px; POSITION: absolute; TOP: 104px" runat="server" ErrorMessage="*" ControlToValidate="txtSobrenome"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator4" style="Z-INDEX: 114; LEFT: 304px; POSITION: absolute; TOP: 72px" runat="server" ErrorMessage="*" ControlToValidate="txtNome"></asp:RequiredFieldValidator> <asp:CompareValidator id="CompareValidator1" style="ZINDEX: 115; LEFT: 320px; POSITION: absolute; TOP: 168px" runat="server" ErrorMessage="Valores positivos apenas" ControlToValidate="txtSalario" Type="Double" ValueToCompare="0" Operator="GreaterThan"></asp:CompareValidator> <asp:CompareValidator id="CompareValidator2" style="ZINDEX: 116; LEFT: 320px; POSITION: absolute; TOP: 144px" runat="server" ErrorMessage="Datas apenas" ControlToValidate="txtContrata" Type="Date" Operator="DataTypeCheck"></asp:CompareValidator> <asp:Button id="Button1" style="Z-INDEX: 117; LEFT: 112px; POSITION: absolute; TOP: 216px" runat="server" Width="72px" Text="Salvar"></asp:Button> <asp:Label id="lblMensagem" style="Z-INDEX: 118; LEFT: 16px; POSITION: absolute; TOP: 248px" runat="server"></asp:Label> </form> </body> </HTML>

Arquivo Listagem05_03.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_03 : System.Web.UI.Page { protected OracleConnection conn; protected OracleCommand comm; protected System.Web.UI.WebControls.DropDownList DropDownList1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Label Label4; protected System.Web.UI.WebControls.TextBox txtNome; protected System.Web.UI.WebControls.TextBox txtContrata; protected System.Web.UI.WebControls.Label Label5; protected System.Web.UI.WebControls.TextBox txtSobrenome; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 75

T u t o r i a l d e A S P. N E T

protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator3; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator4; protected System.Web.UI.WebControls.CompareValidator CompareValidator1; protected System.Web.UI.WebControls.CompareValidator CompareValidator2; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label lblMensagem; protected System.Web.UI.WebControls.TextBox txtSalario; private void Page_Load(object sender, System.EventArgs e) { conn = OracleConnection("Server=apisora2.tecnorede.mt;User Id=fsomalia;Password=654321"); conn.Open();

new

if (!IsPostBack) { OracleDataAdapter adpt = new OracleDataAdapter("select email from hr.employees order by email", conn); try {

DataSet ds = new DataSet(); adpt.Fill(ds, "Employees"); DropDownList1.DataSource = ds; DropDownList1.DataBind();

CarregaFuncionario(DropDownList1.SelectedValue); } catch {} } } private void CarregaFuncionario(string email) { comm = new OracleCommand("select first_name, last_name, hire_date, salary from hr.employees where email = :email", conn); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["email"].Value = email; OracleDataReader dr = comm.ExecuteReader(); if (dr.Read()) { txtNome.Text = dr["first_name"].ToString(); txtSobrenome.Text = dr["last_name"].ToString(); txtContrata.Text = ((DateTime) dr["hire_date"]).ToString("d"); txtSalario.Text = ((decimal) dr["salary"]).ToString("N"); } dr.Close(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e);
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 76

T u t o r i a l d e A S P. N E T

} private void InitializeComponent() { this.DropDownList1.SelectedIndexChanged += System.EventHandler(this.DropDownList1_SelectedIndexChanged); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Unload += System.EventHandler(this.Listagem05_02_Unload); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { CarregaFuncionario(DropDownList1.SelectedValue); } private void System.EventArgs e) { conn.Close(); } Listagem05_02_Unload(object sender,

new new new

private void Button1_Click(object sender, System.EventArgs e) { comm = new OracleCommand("update hr.employees set first_name = :fn, last_name = :ln, hire_date = :hd, salary = :s where email = :email", conn); comm.Parameters.Add("fn", OracleType.VarChar); comm.Parameters.Add("ln", OracleType.VarChar); comm.Parameters.Add("hd", OracleType.DateTime); comm.Parameters.Add("s", OracleType.Double); comm.Parameters.Add("email", OracleType.VarChar); comm.Parameters["fn"].Value = txtNome.Text; comm.Parameters["ln"].Value = txtSobrenome.Text; comm.Parameters["hd"].Value = DateTime.Parse(txtContrata.Text); comm.Parameters["s"].Value = double.Parse(txtSalario.Text); comm.Parameters["email"].Value = DropDownList1.SelectedValue; try {

} catch (Exception ex) { lblMensagem.Text = ex.Message; }

comm.ExecuteNonQuery(); lblMensagem.Text = "Dados atualizados";

Os controles DataList e DataGrid

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 77

T u t o r i a l d e A S P. N E T

Para visualizao de dados em listas, ASP.NET possui dois controles bastante teis: DataList e DataGrid. Eles permitem visualizar dados de um banco de dados de forma tabular (uma listagem de vrios registros, com vrias colunas). DataGrid DataGrid um controle utilizado para gerenciamento de dados. Com ele possvel visualizar, apagar, atualizar e inserir dados. Embora complexo, o DataGrid tenta ser o mais flexvel possvel. DataGrid possui ainda a caracterstica de paginar automaticamente os dados. Basicamente, para utilizar o DataGrid voc precisa realizar o bind do DataGrid com um DataSet. Normalmente, voc vai realizar operaes como esta em seu Web Form: private void CarregaGrid() { OracleConnection conn = null; OracleDataAdapter adapt = null; try {

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e", conn); DataSet ds = new DataSet(); adapt.Fill(ds, "Employees"); DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

} catch { }

No mtodo acima, ns preenchemos um DataSet com uma nova tabela (Employees) obtida a partir de um OracleDataAdapter. Aps termos o DataSet preenchido, basta configurar corretamente o DataGrid, informando o DataSource como sendo o DataSet, e o DataMember como sendo a tabela que desejamos mostrar no grid. Aps isso, basta preencher o DataGrid com os dados, utilizando o mtodo DataBind(). O programa da listagem 5.4 mostra um grid criado com este mtodo. Listagem 5.4: Uso de um DataGrid

Arquivo Listagem05_04.aspx

<%@ Page language="c#" Codebehind="Listagem05_04.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_04" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_04</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 78

T u t o r i a l d e A S P. N E T

</HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; 16px; POSITION: absolute; TOP: 16px" runat="server"></asp:DataGrid> </form> </body> </HTML>

LEFT:

Arquivo Listagem05_04.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_04 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { CarregaGrid(); } } private void CarregaGrid() { OracleConnection conn = null; OracleDataAdapter adapt = null; try {

conn = new OracleConnection("Server=apisora2;User Id=hr;Password=hr"); adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e", conn); DataSet ds = new DataSet(); adapt.Fill(ds, "Employees"); DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

} catch { }

#region Web Form Designer generated code override protected void OnInit(EventArgs e) {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 79

T u t o r i a l d e A S P. N E T

InitializeComponent(); base.OnInit(e);

private void InitializeComponent() { this.DataGrid1.SelectedIndexChanged += System.EventHandler(this.DataGrid1_SelectedIndexChanged); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DataGrid1_SelectedIndexChanged(object DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex; } } }

new

sender,

Execute a pgina e voc ver uma pgina uma tabela com os dados obtidos do banco de dados. Os nomes das colunas, por padro, so automaticamente obtidos do DataSet. Uma das coisas que podem ser feitas para este DataGrid embelezamento. Podemos configurar os estilos que quisermos para o DataGrid. Isso pode ser feito de duas maneiras: 1. Configurando um estilo geral para todo o DataGridm, utilizando as propriedades de estilo do controle (BackColor, ForeColor, CssClass, Font, etc.) 2. Configurando um estilo para cada sesso especial do DataGrid. O DataGrid permite configurar estilos para as seguintes sesses: AlternateItemStyle: estilo aplicado a linhas alternantes do grid EditItemStyle: estilo aplicado aos itens em modo de edio FooterStyle: estilo aplicado ao rodap do grid HeaderStyle: estilo aplicado ao cabealho do grid ItemStyle: estilo aplicado a cada item do grid PagerStyle: estilo aplicado ao mecanismo de pgina do grid SelectedItemStyle: estilo aplicado aos itens selecionados no grid Como exemplo, utilizamos o mesmo grid do programa anterior e fizemos um novo Web Form que pode ser visto na listagem 5.5. Este novo Web Form associado ao arquivo de estilos padrao.css, que define alguns estilos como classes CSS. Definimos a propriedade CssClass do DataGrid para base. Modificamos CssClass das propriedades HeaderStyle e ItemStyle tambm, para titulo e registro, respectivamente. Essas propriedades foram modificadas em tempo de layout, utilizando a caixa de Properties do Visual Studio, mas poderiam ser modificadas em tempo de execuo, com cdigo C#, da mesma forma. Listagem 5.5: Aplicando estilos no DataGrid

Arquivo Listagem05_05.aspx

<%@ Page language="c#" Codebehind="Listagem05_05.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_05" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 80

T u t o r i a l d e A S P. N E T

7.1">

<title>Listagem05_05</title> <meta name="GENERATOR" Content="Microsoft

Visual

Studio

.NET

<meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <LINK href="padrao.css" type="text/css" rel="stylesheet"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> &nbsp; <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" CssClass="base"> <ItemStyle CssClass="registro"></ItemStyle> <HeaderStyle CssClass="titulo"></HeaderStyle> </asp:DataGrid> </form> </body> </HTML>

Arquivo Listagem05_05.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_05 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { CarregaGrid(); } } private void CarregaGrid() { OracleConnection conn = null; OracleDataAdapter adapt = null; try { Id=hr;Password=hr");

conn

new

OracleConnection("Server=apisora2;User

adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e order by e.employee_id", conn); DataSet ds = new DataSet(); adapt.Fill(ds, "Employees");

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 81

T u t o r i a l d e A S P. N E T

} catch { }

DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DataGrid1_PageIndexChanged(object System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex; CarregaGrid(); } private void DataGrid1_SortCommand(object System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { } private void DataGrid1_EditCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { DataGrid1.EditItemIndex = e.Item.ItemIndex; } } }

source,

source,

source,

Arquivo padrao.css

.base, .titulo, .registro { font-family: Verdana; font-size: 10pt; border: solid 1px black; } .titulo { font-weight: bold; color: black; } .registro { font-weight: normal;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 82

T u t o r i a l d e A S P. N E T

color: dimgray;

Agora, a nossa listagem tem uma aparncia melhor, mas o cabealho (ttulo das colunas) no est bom o suficiente. Seria til utilizar nomes melhores para a lngua portuguesa do que nomes de campos de tabelas. O DataGrid cria esses nomes porque sua propriedade AutoGenerateColumns est configurada para true. Dessa forma, o DataGrid automaticamente utiliza os nomes das colunas da tabela como nomes de colunas do DataGrid. Voc pode especificar as colunas que o grid vai ter da forma que desejar. Para isso, primeiro importante configurar AutoGenerateColumns para false. Dessa forma, o DataGrid no ir criar nenhuma coluna automaticamente. Se voc rodar a aplicao dessa forma, voc ver que nenhum dado mostrado. Vamos especificar as colunas que queremos mostrar. FIRST_NAME ser renomeada para Nome. LAST_NAME ser renomeada para Sobrenome. SALARY ser renomeada para Salrio. O campo EMPLOYEE_ID no ser mostrado. Isso pode ser feito em tempo de execuo, em C#, configurando a propriedade Columns do DataGrid. Cada item da coleo Columns do tipo DataGridColumn. Com esse objeto DataGridColumn possvel configurar o texto do cabealho, o texto do rodap, os estilos de cabealho e de rodap, se a coluna ficar visvel ou no, entre outras configuraes. A configurao as colunas tambm pode ser feita em tempo de layout, com ajuda de uma GUI do Visual Studio. A GUI simplesmente deixa mais simples o trabalho de configurar o DataGrid, que feito em ASP.NET na pgina do Web Form. Para acessar a GUI, basta clicar na propriedade Columns da caixa de Properties. Para alterar o estilo da coluna (como largura), podemos configurar a propriedade HeaderStyle, da coluna que quisermos. Utilizando a GUI do Visual Studio, acesse o item Format, e escolha na rvore de itens esquerda a coluna desejada. Ns fizemos as alteraes de colunas, e obtivemos o resultado mostrado na listagem 5.6. Note as configuraes feitas em ASP.NET. Listagem 5.6: Configurando as colunas de um DataGrid

Arquivo Listagem05_06.aspx

<%@ Page language="c#" Codebehind="Listagem05_06.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_06" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_06</title> <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> <LINK href="padrao.css" type="text/css" rel="stylesheet"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server"
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 83

T u t o r i a l d e A S P. N E T

CssClass="base" AutoGenerateColumns="False"> <ItemStyle CssClass="registro"></ItemStyle> <HeaderStyle CssClass="titulo"></HeaderStyle> <Columns> <asp:BoundColumn Visible="False" DataField="EMPLOYEE_ID" HeaderText="ID"> <HeaderStyle Width="120px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="FIRST_NAME" HeaderText="Nome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="LAST_NAME" HeaderText="Sobrenome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="SALARY" HeaderText="Sal&#225;rio" DataFormatString="{0:N2}"> <HeaderStyle Width="120px"></HeaderStyle> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundColumn> </Columns> </asp:datagrid></form> </body> </HTML>

Arquivo Listagem05_06.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_06 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { CarregaGrid(); } } private void CarregaGrid() { OracleConnection conn = null; OracleDataAdapter adapt = null;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 84

T u t o r i a l d e A S P. N E T

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e order by e.first_name", conn); DataSet ds = new DataSet(); adapt.Fill(ds, "Employees"); DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

try {

} catch { }

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

Uma das caractersticas mais interessantes do DataGrid a possibilidade fazer paginao de dados. Paginao a possibilidade de filtrar a quantidade de informaes que sero mostradas em uma pgina, mostrando apenas uma quantidade humanamente possvel de se ler. As outras informaes ficam acessveis a partir de uma lista de pginas. bastante simples de se realizar essa tarefa. Basta configurar a propriedade AllowPaging para true, e especificar a quantidade de linhas que haver em cada pgina em PageSize. S isso, no entanto, no basta. preciso especificar o que fazer quando o usurio clicar em um dos controles para mudar de pgina. Basicamente, voc deve especificar o evento PageIndexChanged para fazer a mudana. Cdigo abaixo mostra como fazer isso: private void DataGrid1_PageIndexChanged(object System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex; CarregaGrid(); } source,

Voc pode especificar a formatao do paginador (controle de pginas) utilizando a propriedade PagerStyle do DataGrid. O cdigo da listagem 5.7 o mesmo DataGrid que o anterior, a no ser pelo fato de que tem paginao. Listagem 5.7: Uso de paginao em DataGrid

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 85

T u t o r i a l d e A S P. N E T

Arquivo Listagem05_07.aspx

<%@ Page language="c#" Codebehind="Listagem05_07.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_07" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_07</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <LINK href="padrao.css" type="text/css" rel="stylesheet"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" AutoGenerateColumns="False" CssClass="base" AllowPaging="True" PageSize="20"> <ItemStyle CssClass="registro"></ItemStyle> <HeaderStyle CssClass="titulo"></HeaderStyle> <Columns> <asp:BoundColumn Visible="False" DataField="EMPLOYEE_ID" HeaderText="ID"> <HeaderStyle Width="120px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="FIRST_NAME" HeaderText="Nome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="LAST_NAME" HeaderText="Sobrenome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="SALARY" HeaderText="Sal&#225;rio" DataFormatString="{0:N2}"> <HeaderStyle Width="120px"></HeaderStyle> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundColumn> </Columns> <PagerStyle Position="Top" Mode="NumericPages"></PagerStyle> </asp:datagrid> </form> </body> </HTML>

Arquivo Listagem05_07.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web;


Documento: TIPX-1 Pgina 86

using using using using using using using

Cuiab, 23 de Agosto de 2005, 12:17

T u t o r i a l d e A S P. N E T

using using using using

System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Licao05 { public class Listagem05_07 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { CarregaGrid(); } } private void CarregaGrid() { OracleConnection conn = null; OracleDataAdapter adapt = null; try {

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e order by e.first_name", conn); DataSet ds = new DataSet(); adapt.Fill(ds, "Employees"); DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

} catch { }

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_Pa geIndexChanged); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void DataGrid1_PageIndexChanged(object System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex;
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1

source,

Pgina 87

T u t o r i a l d e A S P. N E T

CarregaGrid();

O DataGrid permite ainda a ordenao de dados com um simples clique no ttulo da coluna. Bom, isso no feito exatamente automtico, mas bastante simples. Antes de tudo, preciso configurar o DataGrid para permitir ordenaes. Para isso, configure a propriedade AllowSorting para true. Isso vai fazer com que os ttulos de colunas sejam modificados para links clicveis. E agora configure o evento SortCommand para buscar os dados ordenados pela coluna selecionada. Claro que antes preciso saber qual foi a coluna clicada. Isso fcil. O evento SortCommand recebe um objeto do tipo DataGridSortCommandEventArgs que tem uma propriedade chamado SortExpression. SortExpression vai indicar qual foi a coluna clicada. E de onde SortExpression obtm seu valor? Da temos que voltar na configurao das colunas. Todo objeto DataGridColumn possui um atributo chamado SortExpression. Se voc for utilizar ordenao, preciso configurar SortExpression com um identificador que identifique a coluna clicada. Vamos fazer isso. O programa da listagem 5.8 possui ordenao. Ele idntico ao programa anterior, a no ser pelo fato de que possui ordenao. A primeira coisa que fizemos para alterar o programa foi configurar os SortExpression de todas as colunas, com o mesmo nome da coluna da tabela. Depois, configuramos a propriedade AllowSorting para permitir ordenao, e criamos um mtodo para o evento de SortCommand, chamando CarregaGrid() com o contedo do SortExpression do objeto de argumentos do evento.. Se voc acompanhou, vai perceber que agora CarregaGrid() possui um parmetro. Aqui utilizamos o velho overloading de mtodos para facilitar nossa vida. Em alguns pontos do nosso programa, estamos utilizando CarregaGrid(). No precisamos mexer nestas chamadas; apenas criamos uma nova assinatura para o mtodo para fazer as novas chamadas. O cdigo completo do programa pode ser visto a seguir. Listagem 5.8: Ordenao com DataGrid

Arquivo Listagem05_08.aspx

<%@ Page language="c#" Codebehind="Listagem05_08.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_08" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_08</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <LINK href="padrao.css" type="text/css" rel="stylesheet"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server">

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 88

T u t o r i a l d e A S P. N E T

<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" AutoGenerateColumns="False" CssClass="base" AllowPaging="True" PageSize="20" AllowSorting="True"> <ItemStyle CssClass="registro"></ItemStyle> <HeaderStyle CssClass="titulo"></HeaderStyle> <Columns> <asp:BoundColumn Visible="False" DataField="employee_id" SortExpression="employee_id" HeaderText="ID"> <HeaderStyle Width="120px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="FIRST_NAME" SortExpression="FIRST_NAME" HeaderText="Nome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="LAST_NAME" SortExpression="LAST_NAME" HeaderText="Sobrenome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="SALARY" SortExpression="SALARY" HeaderText="Sal&#225;rio" DataFormatString="{0:N2}"> <HeaderStyle Width="120px"></HeaderStyle> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundColumn> </Columns> <PagerStyle Position="Top" Mode="NumericPages"></PagerStyle> </asp:datagrid> </form> </body> </HTML>

Arquivo Listagem05_08.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using using

namespace Licao05 { public class Listagem05_08 : System.Web.UI.Page { protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { CarregaGrid(); }

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 89

T u t o r i a l d e A S P. N E T

} private void CarregaGrid() { CarregaGrid(""); } private void CarregaGrid(string filtro) { OracleConnection conn = null; OracleDataAdapter adapt = null; try {

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e", conn); if (filtro != "") adapt.SelectCommand.CommandText += " order by DataSet ds = new DataSet(); adapt.Fill(ds, "Employees"); DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

"+ filtro;

} catch { }

private void DataGrid1_PageIndexChanged(object System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex; CarregaGrid(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); }

source,

private void InitializeComponent() { this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_Pa geIndexChanged); this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataGrid1_So rtCommand); this.Load += new System.EventHandler(this.Page_Load); } #endregion

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 90

T u t o r i a l d e A S P. N E T

private void DataGrid1_SortCommand(object System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { string filtro = e.SortExpression; CarregaGrid(filtro); } } }

source,

O DataGrid um controle bastante verstil. Voc j viu como simples mostrar uma quantidade de registros em um DataGrid, como customizar a aparncia com estilos e definio de colunas, aprendeu a paginar e a ordenar dados. Mas ainda tem mais por vir. possvel especificar uma variedade de colunas no DataGrid. Voc j conheceu as colunas que guardam valores. Eles so linkadas a uma coluna da tabela no DataSet e so chamadas Bound Column. Mas este no o nico tipo de colunas que voc pode ter. Ainda existem as:

Button Columns: So colunas que permitem que voc edite e exclua dados diretamente do grid. Muito interessantes para criar pginas de manuteno de dados compactas. HyperLinks Columns: Se voc no se interessa por fazer manuteno de dados dentro de um grid, voc pode utilizar um link ao lado do item que direciona para uma pgina de edio. Voc pode criar uma Hyperlink Column que cria esses links. Template Columns: Se os dados da coluna so especiais (como um valor booleano ou um valor de outra tabela), voc pode utilizar uma Template Column. Ela permite colocar qualquer tipo de HTML dentro de uma coluna.

Para nosso exemplo, vamos incluir duas colunas de comando: uma para excluir um item, outra para editar um item. Vamos utilizar o construtor de propriedades do DataGrid, ou seja a GUI do Visual Studio, para monta estas colunas. Para excluir itens, vamos incluir uma Button Column, do tipo Excluir. Configuramos algumas propriedades como HeaderText e Text. HeaderText o ttulo da coluna, Text o texto que ir aparecer em em cada coluna. Agora, o mais importante: precisamos definir um mtodo para tratar o evento DeleteCommand do DataGrid. DeleteCommand disparado sempre que o usurio clica em um dos botes Excluir do DataGrid. O que queremos excluir o item selecionado para excluso. O item selecionado para excluso pode ser buscado na propriedade Item do objeto DataGridCommandEventArgs, recebido pelo evento. Escrevemos uma funo de excluso igual a essa: private void DataGrid1_DeleteCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { OracleConnection conn = null; OracleCommand comm = null; try { source,

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); conn.Open(); comm = new OracleCommand("delete from hr.employees e where e.employee_id = :id", conn); comm.Parameters.Add("id", OracleType.Number); comm.Parameters["id"].Value = e.Item.Cells[0].Text;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 91

T u t o r i a l d e A S P. N E T

comm.ExecuteNonQuery(); } catch (Exception exc) { txtMensagem.Text = exc.Message; } finally { if (conn != null) conn.Close(); CarregaGrid(); } opo de excluso pode ser encontrado no exemplo

O datagrid com Listagem05_09.aspx.

Para criar botes de editar, o procedimento semelhante. Criamos um Button Column do tipo Edit, e configuramos Header Text, Edit Text, Cancel Text e Update Text para mensagens em portugus. Da mesma forma que o Delete Column, os botes de edio, alterao e cancelamento de edio precisam de eventos de servidor configurados. Quando voc clica no boto editar, o evento EditCommand disparado. Quando voc clica em no boto de atualizao, o evento UpdateCommand disparado. E por fim, quando voc clica no boto de cancelamento, o evento CancelCommand disparado. Para configurar o evento de edio corretamente, voc precisa setar a propriedade EditItemIndex do datagrid com o ndice do registro que foi clicado. Esta propriedade indica qual a linha do datagrid que est sendo editada. Voc pode obter a linha que foi clicada a partir da propriedade Item.ItemIndex, do objeto DataGridCommandEventArgs que enviado como parmetro para o mtodo do evento. Um mtodo para editar um registro no grid poderia ser o seguinte: private void DataGrid1_EditCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { DataGrid1.EditItemIndex = e.Item.ItemIndex; CarregaGrid(); } source,

Voc ir observar que, depois de implementado esse evento, toda vez que voc clica em um boto editar, aquela linha se transforma em caixas de edio, e o boto Editar se transforma em dois botes: Atualizar e Cancelar. O boto Cancelar mais simples de se configurar. Crie um mtodo para o evento CancelCommand da seguinte forma: private void DataGrid1_CancelCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { DataGrid1.EditItemIndex = -1; CarregaGrid(); } source,

Ou seja, para cancelar uma edio, basta configurar EditItemIndex para nenhuma linha (-1). Para salvar a edio feita na linha, voc precisa clicar no boto Salvar. Para que o boto Salvar funcione, configure o mtodo UpdateCommand. O mtodo de UpdateCommand

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 92

T u t o r i a l d e A S P. N E T

normalmente ter um comando de UPDATE no banco, e remover o EditItemIndex do registro. Dessa forma: private void DataGrid1_UpdateCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { OracleConnection conn = null; OracleCommand comm = null; string string string string try { id = DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); fn = ((TextBox) e.Item.Cells[1].Controls[0]).Text; ln = ((TextBox) e.Item.Cells[2].Controls[0]).Text; s = ((TextBox) e.Item.Cells[3].Controls[0]).Text; source,

conn = new OracleConnection("Server=apisora2;User Id=hr;Password=hr"); conn.Open(); comm = new OracleCommand("update employees e set e.first_name = :fn, e.last_name = :ln, e.salary = :s where e.employee_id = :id", conn); comm.Parameters.Add("fn", OracleType.VarChar); comm.Parameters.Add("ln", OracleType.VarChar); comm.Parameters.Add("s", OracleType.Double); comm.Parameters.Add("id", OracleType.Int32); comm.Parameters["fn"].Value = fn; comm.Parameters["ln"].Value = ln; comm.Parameters["s"].Value = s; comm.Parameters["id"].Value = id; comm.ExecuteNonQuery(); DataGrid1.EditItemIndex = -1; } catch (Exception exc) { txtMensagem.Text = exc.Message; } finally { if (conn != null) conn.Close(); CarregaGrid(); }

Voc deve ter percebido muitas coisas novas neste bloco de cdigo. Vamos por partes: string id = DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); Por que estamos utilizando essa propriedade DataKeys quando poderamos obter o valor do id a partir e e.Item.Cells[0].Text? Na verdade, no podemos utilizar esse tilmo recurso. O objeto DataGridCommandEventArgs (e) recebido pelo mtodo contm os novos dados editados pelo usurio, e no os antigos. Isso quer dizer que e.Item.Cells[0].Text conter uma string vazia, j que o usurio no digitou valores para o id. E qual a da propriedade DataKeys? DataKeys uma coleo de valores chaves para um registro. DataGrid.DataKeys[e.Item.ItemIndex] indica qual a chave para o registro atual na hora da atualizao. Mas antes de voc pedir quais so as chaves para aquele registro, voc precisa informar quais colunas so colunas chaves da tabela.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 93

T u t o r i a l d e A S P. N E T

Voc pode fazer isso visualmente, no quadro Properties do designer grfico, configurando a propriedade DataKeyField. Ou pode fazer programaticamente, no evento de Load da pgina, setando a propriedade DataKeyField do DataGrid dessa forma: DataGrid1.DatakeyField = employee_id; Dessa forma, employee_id includo como campo chave da tabela, e quando pedirmos DataGrid.DataKeys[e.Item.ItemIndex] mais tarde, ele nos retornar o valor de employee_id para aquele registro. string fn = ((TextBox) e.Item.Cells[1].Controls[0]).Text; string ln = ((TextBox) e.Item.Cells[2].Controls[0]).Text; string s = ((TextBox) e.Item.Cells[3].Controls[0]).Text; Porque fazemos estas converses para obter o valor que o usurio digitou? No bastaria somente fazer e.Item.Cells[1].Text? No, no possvel. preciso estar atento para o que significa a propriedade Item. Item na verdade uma linha da tabela que o DataGrid. Esse Item possui clulas Cells, que so clulas de uma tabela em ASP.NET. E cada clula um container de objetos ASP.NET. Quando visualizamos dados, o texto visualizado no DataGrid escrito diretamente na propriedade Text de cada clula. Mas quando editamos dados, as clulas no mais contm valores na propriedade Text. Ao contrrio, elas possuem objetos ASP.NET prprios para edio (por exemplo, TextBox). Todos os controles filhos de uma clula (alis, de qualquer controle ASP.NET) ficam dentro da coleo Controls. Como, no nosso exemplo, cada clula s possui um TextBox, seguro afirmar que Controls[0] um TextBox. Ento utilizamos a propriedade Text de cada TextBox, por que l que esto os dados digitados pelo usurio. O restante do cdigo deve ser familiar para voc. Note que retiramos o datagrid do modo de edio ao chamar o comando DataGrid1.EditItemIndex = -1; no fim do procedimento. A listagem 5.10 mostra um datagrid totalmente funcional. Listagem 5.10: DataGrid com edio, excluso, ordenao e paginao.

Arquivo Listagem05.10.aspx

<%@ Page language="c#" Codebehind="Listagem05_10.aspx.cs" AutoEventWireup="false" Inherits="Licao05.Listagem05_10" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem05_10</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <LINK href="padrao.css" type="text/css" rel="stylesheet"> </HEAD> <body MS_POSITIONING="GridLayout">

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 94

T u t o r i a l d e A S P. N E T

<form id="Form1" method="post" runat="server"> <asp:datagrid id="DataGrid1" style="Z-INDEX: 103; LEFT: 8px; POSITION: absolute; TOP: 32px" runat="server" AutoGenerateColumns="False" CssClass="base" AllowPaging="True" PageSize="20" AllowSorting="True" DataKeyField="employee_id"> <EditItemStyle CssClass="registro"></EditItemStyle> <ItemStyle CssClass="registro"></ItemStyle> <HeaderStyle CssClass="titulo"></HeaderStyle> <Columns> <asp:BoundColumn Visible="False" DataField="employee_id" SortExpression="employee_id" HeaderText="ID"> <HeaderStyle Width="120px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="FIRST_NAME" SortExpression="FIRST_NAME" HeaderText="Nome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="LAST_NAME" SortExpression="LAST_NAME" HeaderText="Sobrenome"> <HeaderStyle Width="100px"></HeaderStyle> </asp:BoundColumn> <asp:BoundColumn DataField="SALARY" SortExpression="SALARY" HeaderText="Sal&#225;rio" DataFormatString="{0:N2}"> <HeaderStyle Width="120px"></HeaderStyle> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundColumn> <asp:ButtonColumn Text="Excluir" HeaderText="Excluir" CommandName="Delete"> <HeaderStyle Width="60px"></HeaderStyle> </asp:ButtonColumn> <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Salvar" HeaderText="Alterar" CancelText="Cancelar" EditText="Editar"> <HeaderStyle Width="150px"></HeaderStyle> </asp:EditCommandColumn> </Columns> <PagerStyle Position="Top" Mode="NumericPages"></PagerStyle> </asp:datagrid> <asp:Label id="txtMensagem" style="Z-INDEX: 102; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server" CssClass="base" ForeColor="Red"></asp:Label> </form> </body> </HTML>

Arquivo Listagem05.10.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Data.OracleClient; System.Drawing; System.Web; System.Web.SessionState;

using using using using using using using using

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 95

T u t o r i a l d e A S P. N E T

using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace Licao05 { public class Listagem05_10 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label txtMensagem; protected System.Web.UI.WebControls.DataGrid DataGrid1; private void Page_Load(object sender, System.EventArgs e) { txtMensagem.Text = ""; if (!IsPostBack) { CarregaGrid(); } } private void CarregaGrid() { CarregaGrid(""); } private void CarregaGrid(string filtro) { OracleConnection conn = null; OracleDataAdapter adapt = null; try {

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); adapt = new OracleDataAdapter("select e.employee_id, e.first_name, e.last_name, e.salary from hr.employees e", conn); if (filtro != "") adapt.SelectCommand.CommandText += " order by DataSet ds = new DataSet(); adapt.Fill(ds, "Employees"); DataGrid1.DataSource = ds; DataGrid1.DataMember = "Employees"; DataGrid1.DataBind();

"+ filtro;

} catch (Exception e) { txtMensagem.Text = e.Message; }

private void DataGrid1_PageIndexChanged(object System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex; CarregaGrid(); } private void DataGrid1_SortCommand(object System.Web.UI.WebControls.DataGridSortCommandEventArgs e) {
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1

source,

source,

Pgina 96

T u t o r i a l d e A S P. N E T

string filtro = e.SortExpression; CarregaGrid(filtro); source,

private void DataGrid1_DeleteCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { OracleConnection conn = null; OracleCommand comm = null; try {

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); conn.Open(); comm = new OracleCommand("delete from hr.employees e where e.employee_id = :id", conn); comm.Parameters.Add("id", OracleType.Number); comm.Parameters["id"].Value = e.Item.Cells[0].Text; comm.ExecuteNonQuery(); } catch (Exception exc) { txtMensagem.Text = exc.Message; } finally { if (conn != null) conn.Close(); CarregaGrid(); } } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_Pa geIndexChanged); this.DataGrid1.CancelCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_Cancel Command); this.DataGrid1.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_EditCo mmand); this.DataGrid1.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataGrid1_So rtCommand); this.DataGrid1.UpdateCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_Update Command); this.DataGrid1.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_Delete Command); this.Load += new System.EventHandler(this.Page_Load); } #endregion

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 97

T u t o r i a l d e A S P. N E T

private void DataGrid1_EditCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { DataGrid1.EditItemIndex = e.Item.ItemIndex; CarregaGrid(); } private void DataGrid1_CancelCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { DataGrid1.EditItemIndex = -1; CarregaGrid(); } private void DataGrid1_UpdateCommand(object System.Web.UI.WebControls.DataGridCommandEventArgs e) { OracleConnection conn = null; OracleCommand comm = null;

source,

source,

source,

string id = DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); string fn = ((TextBox) e.Item.Cells[1].Controls[0]).Text; string ln = ((TextBox) e.Item.Cells[2].Controls[0]).Text; string s = ((TextBox) e.Item.Cells[3].Controls[0]).Text; try {

conn = new OracleConnection("Server=apisora2;User Id=fsomalia;Password=654321"); conn.Open(); comm = new OracleCommand("update employees e set e.first_name = :fn, e.last_name = :ln, e.salary = :s where e.employee_id = :id", conn); comm.Parameters.Add("fn", OracleType.VarChar); comm.Parameters.Add("ln", OracleType.VarChar); comm.Parameters.Add("s", OracleType.Number); comm.Parameters.Add("id", OracleType.Number); comm.Parameters["fn"].Value = fn; comm.Parameters["ln"].Value = ln; comm.Parameters["s"].Value = s; comm.Parameters["id"].Value = id; comm.ExecuteNonQuery(); DataGrid1.EditItemIndex = -1; } catch (Exception exc) { txtMensagem.Text = exc.Message; } finally { if (conn != null) conn.Close(); CarregaGrid(); } } }

DataList

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 98

T u t o r i a l d e A S P. N E T

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 99

T u t o r i a l d e A S P. N E T

Lio 6: Ciclo de vida de pgina e controles

Esta lio fala um pouco sobre o que acontece quando uma pgina requisitada por um usurio. Os objetivos so:

Conhecer o modelo de pgina em ASP.NET Entender como o ciclo de vida de uma pgina (Web Form) em ASP.NET Entender como o ciclo de vida de um controle Web

O modelo de pgina de ASP.NET Voc j sabe que um Web Form ASP.NET formado por duas partes

O cdigo de apresentao, escrito na linguagem ASP.NET e indica o layout em tempo de programao da pgina. Tem extenso de arquivo aspx. O cdigo de programao, escrito em uma linguagem do Framework .NET, e adiciona inteligncia interface. A extenso depende da linguagem utilizada. Em C# aspx.cs.

Embora um Web Form consista em dois arquivos separados, eles formam uma nica unidade quando a pgina requisitada. O cdigo dos arquivos de classe compilado em arquivos de biblioteca (dll) e armazenado no servidor. Os arquivos aspx tambm so compilados, mas de uma forma diferente. Quando o usurio faz a requisio pela pgina pela primeira vez, o Framework .NET gera uma classe que representa a estrutura da pgina e compila uma segunda dll. A classe gerada a partir do aspx herda da classe escrita no aspx.cs. Esta nica dll final (gerada na requisio) rodada pelo servidor para gerar a pgina requisitada. Neste ponto, no temos nada em HTML: a pgina apenas uma classe do .NET. Se a pgina contm Web Controls, o que normal, a classe derivada serve como um continer para cada controle colocado na pgina. As instncias dos controles so criados em tempo de execuo, e cada objeto gera o HTML necessrio para o cliente. Para desenvolvedores acostumados com linguagens de script de servidor (como ASP, PHP e at mesmo PL/SQL) isso algo novo. O modelo de destas linguagens consiste em um cdigo procedural que gera cdigo HTML. Um arquivo de cdigo contm cdigo de script de cliente (JavaScript, por exemplo), HTML e linguagem especfica (ASP, PHP, JavaScript) coexistindo num mesmo arquivo. Conforme o cdigo vai sendo executado, a sada gerada j o cdigo HTML do cliente.

O ciclo de vida de uma pgina ASP.NET No modelo ASP.NET, a pgina inteira , na verdade, um programa executvel que gera sada para o cliente (navegador ou aparelho). Neste modelo, a pgina passa por uma srie de estgios similares a qualquer classe: inicializao, processamento e desalocao, mas com alguns detalhes especficos:

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 100

T u t o r i a l d e A S P. N E T

A pgina passa por todos esses estgios cada vez que chamada. A pgina inicializada, processada e desalocada a cada vez que a pgina requisitada para o servidor. A classe pgina tem um nico estgio renderizao que ocorre pouco antes da desalocao, durante o qual a sada gerada para o cliente (o HTML gerado).

As etapas do ciclo de vida de um Web Form podem ser visualizados no quadro abaixo: Estgio Significa Usos tpicos

Inicializao O evento Init da pgina Durante este evento, a pgina restaura as da pgina executado, e os estados de propriedades dos controles. visualizao da pgina e dos controles so restaurados. Inicializao O evento Load da pgina Durante este evento, o programador do cdigo de executado normalmente faz as inicializaes de usurio controles. Se a primeira vez que a pgina carregada, realiza-se binding de dados. Validao O mtodo de validao dos controles de validao so executados neste momento

Execuo de Se a pgina foi chamada para Durante esta fase, o desenvolvedor pode: eventos responder algum evento de Manipular eventos dos controles Web controles, os eventos so se mais de um controle dispara eventos, executados neste momento no h uma ordem especfica de controles para executarem os eventos

Checar a propriedade IsValid da pgina ou de qualquer controle, se a pgina possui algum controle de validao Salvar manualmente valores na pgina

Limpeza

O evento Unload da pgina Durante esta fase, o desenvolvedor: chamado porque a pgina j Fecha arquivos terminou de renderizar e j pode ser descarregada. Fecha conexes com banco que ainda esto abertas

Descarta objetos

Para melhor visualizar os estgios, rode o programa mostrado na listagem 6.1. Quando o boto Execute clicado, a pgina submetida ao servidor e os eventos da pgina so disparados. Nota: Toda vez que uma pgina submetida e retorna nela mesma, isso chamado de roundtrip. Dados de postback so os dados enviados pela pgina em um roundtrip. Definimos trs eventos: o de Init da pgina, o de PreRender da pgina, e o de Disposed da pgina. Em cada um deles geramos uma sada em HTML para ser visualizado na pgina, com Response.Write(). O objeto Response representa o canal de sada para o cliente. Falaremos mais sobre ele mais tarde. Se voc executar o programa, ir perceber trs coisas:

A ordem de execuo dos eventos a pgina passa pelos trs estgios

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 101

T u t o r i a l d e A S P. N E T

O evento de Disposed no gera sada porque o estgio de gerao de sada j passou A pgina passa pelos trs estgios toda vez que executada use o Fiddler para verificar isso.

Listagem 6.1: Os estgios de uma pgina

Arquivo Listagem06_01.aspx

<%@ Page language="c#" Codebehind="Listagem06_01.aspx.cs" AutoEventWireup="false" Inherits="Licao06.Listagem06_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem06_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 152px" runat="server" Text="Execute" Width="96px"></asp:Button> </form> </body> </HTML>

Arquivo Listagem06_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Licao06 { public class Listagem06_01 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent()
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 102

T u t o r i a l d e A S P. N E T

this.Disposed += System.EventHandler(this.Listagem06_01_Disposed); this.Init += System.EventHandler(this.Listagem06_01_Init); this.PreRender += System.EventHandler(this.Listagem06_01_PreRender); } #endregion e)

new new new

private void Listagem06_01_Init(object sender, System.EventArgs { acabou de ser

this.Response.Write("Pgina inicializada<br>"); }

private void Listagem06_01_Disposed(object sender, System.EventArgs e) { this.Response.Write("Pgina est prestes a descarregar<br>"); } private void Listagem06_01_PreRender(object System.EventArgs e) { this.Response.Write("Pgina est prestes HTML<br>"); } } } sender, a gerar

O ciclo de vida de uma pgina chamado de ciclo de vida de uma pgina os estgios que uma pgina passa, em tempo de execuo, desde sua inicializao, at a desalocao. O servidor carrega a classe dpgina toda vez que ela requisitada, e descarrega antes que o processamento da requisio termina. A pgina, e os controles que a pgina contm, so responsveis por tratar a requisio e gerar o HTML adequado para o cliente. Em qualquer cenrio Web, as pginas so recriadas a cada roundtrip. Assim que o servidor termina de processar a pgina e enviar HTML ao cliente, o servidor libera os recursos utilizados pela pgina. Ao liberar os recursos a cada requisio, a aplicao Web pode crescer em nmero de usurios simultneos. Quando a pgina novamente requisitada, a pgina recriada e todo o processamento realizado novamente. Isso chamado de arquitetura stateless (sem persistncia de estado). Apesar da comunicao com o servidor no manter informaes entre as requisies das pginas, mais agradvel para o cliente que ele tenha a impresso de continuidade. A iluso da continuidade dada pela pgina e pelos controles da pgina. Quando o usurio faz um roundtrip, cada controle precisa se comportar como se ele estivesse iniciando com o mesmo estado que ele estava no fim da ltima requisio. Por exemplo, uma pgina contm um campo de texto que pode ser preenchido pelo usurio e um boto que envia o texto do campo para o servidor. Para efeitos de validao, o usurio no pode ultrapassar 10 caracteres. O usurio envia um texto com

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 103

T u t o r i a l d e A S P. N E T

11 caracteres. O servidor precisa validar, e voltar mesma pgina informando que o texto invlido. A impresso de continuidade para o usurio feita se o servidor envia a pgina com o campo de texto preenchido com o valor que o usurio digitou. Assim, o usurio pode visualizar o texto e corrigir o erro mais rapidamente. Todos os controles ASP.NET tm uma arquitetura que permite esse comportamento automaticamente, sem interveno de programao. Em ASP.NET, o conjunto de dados que devem ser permanecidos nos controles chamado de View State, estado de visualizao. possvel desabilitar o View State de cada controle da pgina configurando a propriedade EnableViewState do controle para false (padro: true). Cada controle tem a responsabilidade de manter seus dados de visualizao. Alm de manter o estado de visualizao, os controles realizam outras tarefas durante o ciclo de vida da pgina. Por exemplo, eles precisam detectar se alguma ao do usurio resultou em uma condio para que o controle execute alguma ao no servidor. Isso chamado de execuo de eventos de controles. A execuo de eventos de controle feita em duas partes: 1. Primeiro, o controle precisa saber se o evento foi disparado. Isso depende de cada controle. Normalmente o controle grava alguma informao em um campo do tipo hidden, chamado __VIEWSTATE, que vai em cada pgina, avalia se este campo mudou desde a ltima requisio. 2. Quando a pgina submetida, o Framework envia os dados de cliente para cada controle. Cada controle, a partir da, tem a responsabilidade de verificar, no valor de __VIEWSTATE, se o cliente fez alguma ao que resultasse em um disparo de evento de servidor. Se sim, o evento correspondente disparado. Por exemplo, o controle TextBox possui um evento chamado TextChanged. Para detectar se o evento deve ser disparado, na hora de renderizar, o controle envia o contedo da propriedade Text como value do elemento input text (para que o usurio possa ver o texto do controle) e tambm como value do elemento __VIEWSTATE da pgina (mas de forma criptografada). Quando a pgina realiza um roundtrip, o controle recebe os dados do cliente, e compara se o valor enviado pelo cliente igual ao que est no __VIEWSTATE. Se for igual, ento o usurio no modificou o campo. Se diferente, ento o usurio modificou o valor de Text do controle, e ao evento TextChanged deve ser disparado. Todas essas atividades que os controles fazem feito de forma ordeira, por fases. Assim, os desenvolvedores precisam saber que informaes esto disponveis para os controles em cada fase de execuo. Por exemplo, um controle no pode invocar o seu controle pai na fase de inicializao, porque no h garantias de que todos os controles tenham sido inicializados. O quadro abaixo mostra todas as fases de vida de um controle, juntamente com o seu relacionamento com a pgina onde ele est.

Fase Inicializao

O que o controle precisa fazer

Mtodo ou evento envolvido

Inicializar as configuraes Evento Init necessrias durante o ciclo de vida Mtodo OnInit() do controle. Ex: Configurar a propriedade

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 104

T u t o r i a l d e A S P. N E T

Fase Carregamento do estado de visualizao

O que o controle precisa fazer inicial de Text do controle TextBox

Mtodo ou evento envolvido

A propriedade ViewState deve ser Mtodo LoadViewState() populada Ex: O Framework copia o valor do campo __VIEWSTATE para o atributo ViewState do controle TextBox

Processamento dos Processar dados submetidos e Mtodo LoadPostData() dados de postback atualizar suas propriedades de acordo. Neste ponto detectado mudana nos estados dos controles. Ex: Verificar o valor enviado pelo cliente para o controle TextBox e atualizar a propriedade Text de acordo. Carregamento Realizar tarefas gerais do controle. Evento Load Nesta etapa j esto disponveis Mtodo OnLoad() os dados do controle, e dados de outros controles. Ex: Realizar tarefas que precisam ser realizadas sempre no controle, e antes de seus eventos Envio de notificaes de mudanas do postback Disparar eventos em decorrncia Mtodo da mudana dos dados do controle RaisePostDataChangedEvent() entre as submisses. Ex: Aps ter detectado que sua propriedade Text mudou, o controle TextBox notifica o Framework que precisa executar um evento Manipular eventos causados pela Mtodo RaisePostBackEvent() mudana de dados de postback e disparar eventos de servidor. Ex: O Framework executa os eventos dos controles que foram disparados Pr renderizao Realizar mudanas no estado do Evento PreRender controle antes de ser renderizado. Mtodo OnPreRender() As mudanas feitas nesta fase so salvas. Ex: Executar alguma tarefa antes de gerar HTML Gravao do estado A propriedade ViewState Mtodo SaveViewState() automaticamente serializada nesta etapa para persistncia de dados. Para melhorar a eficincia, possvel reescrever o mtodo

Manipulao dos eventos de postback

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 105

T u t o r i a l d e A S P. N E T

Fase

O que o controle precisa fazer SaveViewState(). Ex: O Framework salva automaticamente o valor da propriedade ViewState do controle TextBox no elemento __VIEWSTATE.

Mtodo ou evento envolvido

Renderizao

Gerar a sada para o cliente. Ex: O controle TextBox gera um cdigo HTML parecido com <input type=text value=>

Mtodo Render()

Liberao Descarregamento

Realizar limpezas finais antes que Mtodo Dispose() o controle seja desalocado. Realizar limpezas finais antes que Evento UnLoad o controle seja desalocado. Mtodo OnUnLoad() Desenvolvedores normalmente fazer limpeza em Dispose() ao invs de OnUnLoad().

importante sempre lembrar que cada controle passa por todas essas fases antes a cada requisio da pgina. A classe de pgina responsvel por enviar os dados recebidos pelo cliente e informar os controles. A listagem 6.2 mostra um programa que permite que voc visualize quando os eventos da pgina e dos controles esto sendo disparados, para melhor entendimento. Listagem 6.2: Eventos de pgina e controles

Arquivo Listagem06_02.aspx

<%@ Page language="c#" Codebehind="Listagem06_02.aspx.cs" AutoEventWireup="false" Inherits="Licao06.Listagem06_02" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem06_02</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 208px" runat="server" Text="Execute" Width="96px"></asp:Button> </form> </body> </HTML>

Arquivo Listagem06_02.aspx.cs

using System; using System.Collections;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 106

T u t o r i a l d e A S P. N E T

using using using using using using using using

System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Licao06 { public class Listagem06_02 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; e) private void Listagem06_01_Init(object sender, System.EventArgs { } Response.Write("Pgina acabou de ser inicializada<br>"); sender,

private void Listagem06_01_Disposed(object System.EventArgs e) { Response.Write("Pgina foi desalocada<br>"); }

private void Listagem06_01_PreRender(object sender, System.EventArgs e) { Response.Write("Pgina est prestes a gerar HTML<br>"); } e) private void Listagem06_01_Load(object sender, System.EventArgs { } Response.Write("A pgina foi carregada<br>");

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Command += System.Web.UI.WebControls.CommandEventHandler(this.Button1_Command); this.Button1.Init += System.EventHandler(this.Button1_Init); this.Button1.PreRender += System.EventHandler(this.Button1_PreRender); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Button1.Load += System.EventHandler(this.Button1_Load); this.Disposed += System.EventHandler(this.Listagem06_01_Disposed); this.Load += System.EventHandler(this.Listagem06_01_Load); this.Init += System.EventHandler(this.Listagem06_01_Init);

new new new new new new new new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 107

T u t o r i a l d e A S P. N E T

this.PreRender += System.EventHandler(this.Listagem06_01_PreRender); } #endregion

new

private void Button1_Click(object sender, System.EventArgs e) { Response.Write("Evento de click do boto disparado<br>"); } private void Button1_Command(object System.Web.UI.WebControls.CommandEventArgs e) { Response.Write("Evento de comando disparado<br>"); } sender, do boto

private void Button1_Init(object sender, System.EventArgs e) { Response.Write("Boto inicializado<br>"); } private void Button1_Load(object sender, System.EventArgs e) { Response.Write("Boto carregado<br>"); } e) private void Button1_PreRender(object sender, System.EventArgs { } } Response.Write("Boto prestes a gerar HTML<br>");

Sumrio Nesta lio voc aprendeu como o modelo de pgina de uma aplicao ASP.NET. Aprendeu tambm que as pginas so, na verdade, classes .NET que so criadas, executadas e destrudas a cada requisio, e que a gerao de HTML apenas uma das fases da execuo. Os exemplos desta lio ajudam voc a visualizar a passagem destas fases.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 108

T u t o r i a l d e A S P. N E T

Lio 7: Mantendo dados entre requisies

Nesta lio, ser discutido formas de voc manter dados do usurio entre as requisies de pgina. Os tpicos abordados sero:

Entender os modos de permanncia de dados em ASP.NET Entender as opes de permanncia de dados via cliente Entender as opes de permanncia de dados via servidor Aprender a fazer redirecionamento de pginas

Introduo Na lio anterior, voc aprendeu que em cenrios Web normais as informaes de usurio so perdidas entre as requisies de pgina. Ou seja, as aplicaes so stateless (sem permanncia de dados de estado). Voc aprendeu tambm que a arquitetura ASP.NET tenta dar a iluso de permanncia de dados, mantendo o estado dos controles entre as roundtrips. Em alguns momentos, no entanto, voc ir querer manter informaes do usurio por sua conta. Por exemplo, talvez ele precise preencher um cadastro complexo de vrias pginas. Ou voc quer que o usurio responda a um questionrio. Ou simplesmente deseja manter informaes de login do usurio, para saber se ele pode acessar determinada rea do sistema. ASP.NET possui vrios modos de manter informaes do cliente. Esses modos so divididos em duas categorias:

Permanncia de dados do usurio no cliente Permanncia de dados do usurio no servidor

As prximas duas sees iro mostrar como funciona esses modos.

Permanncia de dados de usurio no cliente Uma das formas de manter informaes do usurio entre as vrias requisies de pgina que ele fizer manter essas informaes no com o prprio cliente. Nesta situao, nenhuma informao do cliente guardada no servidor. As tcnicas so as seguintes:

View State Campos de formulrio escondidos Cookies Strings de endereo

View State A propriedade ViewState que todo controle de pgina possui d ao desenvolvedor a possibilidade de salvar vrias informaes entre diferentes requisies de pgina. Este

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 109

T u t o r i a l d e A S P. N E T

o mtodo padro que os controles de ASP.NET usam para manter as informaes dos controles como, por exemplo, a data selecionada no controle Calendar. Quando a pgina processada, o estado atual da pgina e dos seus controles computada e transformada em uma string criptografada, que enviada como um campo escondido para a pgina do usurio (elemento input hidden com id __VIEWSTATE). Quando a pgina submetida de volta para o servidor, o servidor analisa a string criptografada durante a inicializao da pgina e restaura as propriedades ViewState da pgina e seus controles. Voc pode armazenar valores nessas propriedades se quiser. A propriedades ViewState uma lista do tipo chave/valor. Assim, possvel setar valores nessa propriedade utilizando a forma: ViewState[cor] = azul; E obter os valores armazenados na propriedade dessa forma: string cor = (string) ViewState[cor]; Veja o programa da listagem 7.1 para melhor visualizar o uso das propriedades ViewState. Neste programa, o usurio pode salvar uma string digitada, e visualizar seu valor no momento em que quiser. No boto Salva, a string digitada armazenada na propriedade VewState da pgina. O boto Limpa remove a string da lista. Listagem 7.1: Uso de ViewState

Arquivo Listagem07_01.aspx

<%@ Page language="c#" Codebehind="Listagem07_01.aspx.cs" AutoEventWireup="false" Inherits="Licao07.Listagem07_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>Listagem07_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </head> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 232px; POSITION: absolute; TOP: 16px" runat="server" Text="Salva" Width="64px"></asp:Button> <asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 88px" runat="server" Text="L" Width="64px"></asp:Button> <asp:Button id="Button3" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 136px" runat="server" Text="Limpa" Width="64px"></asp:Button> <asp:TextBox id="TextBox1" style="Z-INDEX: 104; LEFT: 56px; POSITION: absolute; TOP: 16px" runat="server"></asp:TextBox> <asp:Label id="Label1" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Valor</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 106; LEFT: 16px; POSITION: absolute; TOP: 64px" runat="server">Valor</asp:Label> <asp:Label id="lblValor" style="Z-INDEX: 107; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server"></asp:Label>
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 110

T u t o r i a l d e A S P. N E T

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

Arquivo Listagem07_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Licao07 { /// <summary> /// Summary description for Listagem07_01. /// </summary> public class Listagem07_01 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Button Button2; protected System.Web.UI.WebControls.Button Button3; protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label lblValor; protected System.Web.UI.WebControls.Label Label2; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here lblValor.Text = ""; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Button2.Click += System.EventHandler(this.Button2_Click); this.Button3.Click += System.EventHandler(this.Button3_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { this.ViewState["Valor"] = TextBox1.Text; } private void Button2_Click(object sender, System.EventArgs e)

new new new

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 111

T u t o r i a l d e A S P. N E T

object v = this.ViewState["Valor"]; if (v != null) lblValor.Text = (string) v;

private void Button3_Click(object sender, System.EventArgs e) { this.ViewState["Valor"] = null; }

As vantagens de se utilizar a tcnica de View State so:


No h utilizao de recursos do servidor. A informao armazenada na pgina do cliente Implementao simples Reteno automtica do estado da pgina e dos controles Melhor segurana que utilizar campos escondidos normais. A string hasheada, comprimida e impessa em formato Unicode

As desvantagens de se utilizar View State so:

Performance. J que as informaes so armazenadas na pgina do cliente, armazenar valores grandes pode gerar demora quando o usurio quiser visualizar a pgina e quando ele estiver submetendo Segurana. Embora as informaes sejam hasheadas, elas podem ser decodificadas. A informao no campo escondido pode ser vista no cdigo fonte da pgina, criando um problema de segurana em potencial

Campos de formulrio escondidos Uma prtica bastante difundida entre os desenvolvedores de aplicaes web para manter dados entre requisies armazen-los em campos de formulrio escondidos (elementos input do tipo hidden). Campos escondidos no so renderizados pelo navegador, mas voc pode armazenar informaes neles como em qualquer outro elemento. Quando a pgina submetida para o servidor, o valor armazenado no campo enviado tambm. ASP.NET tambm permite isso. Basta adicionar controles HTML, especificamente do tipo HtmlInputHidden. Esses controles representam elementos input do tipo hidden de HTML. Para conseguir tirar vantagem do processamento de campos escondidos, voc precisa utilizar o mtodo POST de submisso de dados. Ateno: fcil para um usurio malicioso conseguir ver e modificar o contedo de um campo escondido. Nunca armazene informaes importantes em campos escondidos. O programa da listagem 7.2 idntico ao anterior, a no ser pelo fato de que o dado armazenado em um campo escondido, ao invs da propriedade ViewState da pgina. Voc pode adicionar um controle HtmlinputHidden na sua pgina puxando um controle HIDDEN da aba HTML da Toolbox, e configurar as propriedades id e runat do controle no editor de HTML. runat precisa ter o valor server. Listagem 7.2: Uso de campos de formulrio escondidos

Arquivo Listagem07_02.aspx

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 112

T u t o r i a l d e A S P. N E T

<%@ Page language="c#" Codebehind="Listagem07_01.aspx.cs" AutoEventWireup="false" Inherits="Licao07.Listagem07_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>Listagem07_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </head> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 232px; POSITION: absolute; TOP: 16px" runat="server" Text="Salva" Width="64px"></asp:Button> <asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 88px" runat="server" Text="L" Width="64px"></asp:Button> <asp:Button id="Button3" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 136px" runat="server" Text="Limpa" Width="64px"></asp:Button> <asp:TextBox id="TextBox1" style="Z-INDEX: 104; LEFT: 56px; POSITION: absolute; TOP: 16px" runat="server"></asp:TextBox> <asp:Label id="Label1" style="Z-INDEX: 105; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Valor</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 106; LEFT: 16px; POSITION: absolute; TOP: 64px" runat="server">Valor</asp:Label> <asp:Label id="lblValor" style="Z-INDEX: 107; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server"></asp:Label> </form> </body> </html>

Arquivo Listagem07_02.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Licao07 { public class Listagem07_02 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblValor; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Button Button3; protected System.Web.UI.WebControls.Button Button2; protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.HtmlControls.HtmlInputHidden Valor; private void Page_Load(object sender, System.EventArgs e) {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 113

T u t o r i a l d e A S P. N E T

// Put user code to initialize the page here

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button3.Click += System.EventHandler(this.Button3_Click); this.Button2.Click += System.EventHandler(this.Button2_Click); this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { Valor.Value = TextBox1.Text; } private void Button2_Click(object sender, System.EventArgs e) { lblValor.Text = Valor.Value; } private void Button3_Click(object sender, System.EventArgs e) { Valor.Value = ""; }

new new new

Vantagens de campos de formulrio escondidos:


No utiliza recursos do servidor. O campo escondido armazenado e lido da pgina do cliente Suporte amplo. Quase todos os navegadores e aparelhos suportam dados em campos escondidos Implementao simples

Desvantagens de campos de formulrio escondidos:


Segurana. O campo escondido pode ser lido pelo cliente. Nenhuma proteo utilizada em seus dados Estrutura de armazenamento limitada. O campo escondido no armazena estruturas ricas, como objetos e colees, a no ser que a aplicao implemente isso Performance. Os dados de campos escondidos so enviados e submetidos pelo cliente, podendo gerar alguma perda de velocidade se houverem muitos dados armazenados.

Cookies

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 114

T u t o r i a l d e A S P. N E T

Um cookie uma pequena quantidade de informao armazenada em um arquivo de texto no sistema de arquivos do cliente ou na memria de sesso do navegador. Ele contm dados relacionados pgina que o cliente quer ver, e enviada juntamente com os cabealhos de resposta e requisio da comunicao navegador-servidor. Cookies podem ser temporrios (com um prazo para expirao) ou persistentes. Voc pode utilizar cookies para armazenar informaes especficas do site, do usurio ou da sesso. Os cookies so salvos no equipamento do cliente, e quando o cliente faz alguma requisio para o servidor, o cookie vai junto, podendo ser lido pela aplicao. Um uso bastante comum para armazenar uma chave (normalmente encriptada) que indica que o usurio j est logado na aplicao. Ateno: O navegador apenas envia um cookie para o site que originalmente criou o cookie. No entanto, usurios maliciosos podem roubar cookies e ler seu contedo. recomendvel que voc no armazene informaes importantes em cookies, como senha e nome de usurio. Ao invs disso, armazene uma chave que possa ser utilizada para apontar essas informaes no servidor. Maiores exemplos de uso de cookies podem ser vistas na lio 10: Utilizao de cookies, mais tarde, neste tutorial. Vantagens de cookies:

No utiliza recursos de servidor. O cookie armazenado no aparelho do cliente e pode ser lido a cada submisso Simplicidade. O cookie leve, baseado em texto e em pares chave-valor Expirao configurvel. O cookie pode expirar quando a sesso do navegador acaba, ou pode existir indefinidamente no computador do cliente

Desvantagens de cookies:

Tamanho limitado. A maioria dos navegadores impe um limite de 4KB para o cookie, embora cookies de 8KB estejam se tornando comuns nos navegadores de hoje Recusa do cliente. Alguns usurios desabilitam a aceitao de cookies, limitando sua funcionalidade Segurana. Cookies esto sujeitos a roubo. Os usurios podem manipular cookies no seu computador, o que pode criar um problema de segurana Durabilidade. A durabilidade do cookie no computador do cliente sujeita a interveno do usurio

Strings de endereo Uma string de endereo pode ser criada para carregar informaes da aplicao. Normalmente, utiliza-se uma string de consulta adicionada ao fim da string de endereo da pgina. Por exemplo: http://www.contoso.com/listwidgets.aspx?category=basic&price=100 A string de consulta aquela vista depois do ponto de interrogao (?). A string de consulta, neste caso, possui dois parmetros: category (valor basic) e price (valor 100).

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 115

T u t o r i a l d e A S P. N E T

As strings de consulta so um jeito simples, mas limitado, de manter informaes. Por exemplo, eles so o modo mais fcil de passar informaes de uma pgina a outra. No entanto, a maioria dos navegadores impe um limite de 255 caracteres para o tamanho da string de endereo. Os valores dos parmetros podem ser lidos a partir da propriedade Request da pgina. Request possui uma propriedade chamada QueryString, que possui todos os parmetros enviados via string de consulta. QueryString uma coleo que armazena dados no tipo chave/valor. O programa da listagem 7.3 mostra um modo de acessar essas informaes. Listagem 7.3: Uso de strings de consulta

Arquivo Listagem07_03.aspx

<%@ Page language="c#" Codebehind="Listagem07_03.aspx.cs" AutoEventWireup="false" Inherits="Licao07.Listagem07_03" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem07_03</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:HyperLink id="HyperLink1" style="Z-INDEX: 101; LEFT: 40px; POSITION: absolute; TOP: 48px" runat="server" NavigateUrl="Listagem07_03.aspx?Valor=Abacate">Abacate</asp:HyperLink> <asp:HyperLink id="HyperLink2" style="Z-INDEX: 102; LEFT: 40px; POSITION: absolute; TOP: 80px" runat="server" NavigateUrl="Listagem07_03.aspx?Valor=Banana">Banana</asp:HyperLink> <asp:HyperLink id="HyperLink3" style="Z-INDEX: 103; LEFT: 40px; POSITION: absolute; TOP: 112px" runat="server" NavigateUrl="Listagem07_03.aspx?Valor=Caju">Caju</asp:HyperLink> <asp:Label id="Label1" style="Z-INDEX: 104; LEFT: 40px; POSITION: absolute; TOP: 152px" runat="server">Valor</asp:Label> <asp:Label id="lblValor" style="Z-INDEX: 105; LEFT: 80px; POSITION: absolute; TOP: 152px" runat="server"></asp:Label> </form> </body> </HTML>

Arquivo Listagem07_03.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 116

T u t o r i a l d e A S P. N E T

namespace Licao07 { public class Listagem07_03 : System.Web.UI.Page { protected System.Web.UI.WebControls.HyperLink HyperLink1; protected System.Web.UI.WebControls.HyperLink HyperLink2; protected System.Web.UI.WebControls.HyperLink HyperLink3; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label lblValor; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here lblValor.Text = this.Request.QueryString["Valor"]; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

Vantagens de strings de consulta


No utiliza recursos de servidor Suporte amplo. Quase todos os navegadores e aparelhos suportam strings de consulta Implementao simples. possvel acessar os valores da string de consulta atravs da propriedade do objeto pgina.

Desvantagens de strings de consulta

Segurana. A informao da string de consulta visualizada diretamente da interface do usurio. Os valores de consulta, expostos na Internet via URL, tambm pode ser uma questo de segurana em alguns casos Capacidade limitada. A maioria dos clientes web s suportam strings de endereo com at 255 caracteres

Permanncia de dados de usurio no servidor As opes para armazenar informaes do usurio no servidor tendem a ter maior segurana que os mtodos de armazenamento no cliente, mas eles podem utilizar mais recursos do servidor Web, e podem levar a questes severas de escalabilidade quando o tamanho dos dados grande. ASP.NET possui vrios modos de armazenamento de dados no cliente.

Estado de Aplicao Estado de Sesso

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 117

T u t o r i a l d e A S P. N E T

Suporte de banco de dados

Estado de Aplicao ASP.NET permite que voc salve valores para cada aplicao Web ativa. O estado de aplicao um mecanismo de armazenamento global que pode ser acessado por todas as pginas da aplicao, e til para armazenar informaes que precisam ser mantidas entre roundtrips e entre pginas. As variveis de aplicao, so, de fato, variveis globais acessveis por todas as pginas e usurios. Para armazenar essas variveis, utiliza-se a propriedade Application do objeto pgina. Application uma coleo que armazena valores na forma chave-valor. A listagem 7.4 mostra um programa que mantm uma varivel de aplicao. Essa varivel de aplicao (contador0704) um contador de acesso a pginas. Pea para um amigo acessar a mesma pgina e veja que o contedo da varivel compartilhado. Listagem 7.4: uso de variveis de aplicao

Arquivo Listagem07_04.aspx

<%@ Page language="c#" Codebehind="Listagem07_04.aspx.cs" AutoEventWireup="false" Inherits="Licao07.Listagem07_04" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem07_04</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Label id="lbl" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 16px" runat="server">Acessos:</asp:Label> <asp:Label id="lblAcessos" style="Z-INDEX: 102; LEFT: 88px; POSITION: absolute; TOP: 16px" runat="server"></asp:Label> <asp:Button id="Button1" style="Z-INDEX: 103; LEFT: 24px; POSITION: absolute; TOP: 48px" runat="server" Text="Limpar" Width="72px"></asp:Button> </form> </body> </HTML>

Arquivo Listagem07_04.aspx.cs

using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 118

T u t o r i a l d e A S P. N E T

namespace Licao07 { public class Listagem07_04 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lbl; protected System.Web.UI.WebControls.Label lblAcessos; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here if (Application["Acessos"] == null) Application["Acessos"] = 0; else Application["Acessos"] = Application["Acessos"] + 1; } lblAcessos.Text = Application["Acessos"].ToString();

(int)

#region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { Application["Acessos"] = 0; }

new

Algumas consideraes sobre informaes de aplicao:

O impacto na memria para armazenar dados de aplicao relevante. A memria ocupada pela varivel de sesso liberada at que seja explicitamente removida ou substituda. Por exemplo, manter um conjunto de dados de 10MB na varivel de aplicao permanentemente, por exemplo, no o melhor exemplo de uso. Em ambientes multitarefa, onde h mais de um processador para a execuo da aplicao, cada processo mantm sua prpria varivel de aplicao. Portanto, voc no pode utilizar as variveis de aplicao como variveis globais nicas em ambientes multi-processos.

Vantagens de estado de aplicao


Facilidade de implementao Escopo global. Variveis de aplicao podem ser um bom lugar para armazenar informaes que deveriam ser compartilhadas entre as pginas e sesses da aplicao.
Documento: TIPX-1 Pgina 119

Cuiab, 23 de Agosto de 2005, 12:17

T u t o r i a l d e A S P. N E T

Desvantagens de estado de aplicao

Escopo global. A natureza global do estado de aplicao pode ser uma coisa indesejada. Alm disso, cada processo que roda a aplicao possui um estado de aplicao diferente, e portanto, os valores armazenados podem ser diferentes. Durabilidade. Os dados so armazenados na memria do servidor, e so destrudos se a aplicao encerrada, ou o servidor desligado ou trava. Utilizao de recursos. As variveis de aplicao requerem memria do servidor, o que pode afetar a performance do servidor.

Estado de Sesso ASP.NET permite a voc salvar dados da sesso do usurio, para cada sesso ativa no servidor Web. O estado da sesso similar ao estado da aplicao, exceto que o primeiro escopado na sesso do navegador com o servidor Web. Se diferentes usurios acessam sua aplicao, cada um vai ter um estado de sesso diferente. Alm disso, se um usurio sai da aplicao e volta mais tarde, ele ir ganhar um novo estado de sesso. O estado de sesso permite que voc:

Identifique unicamente as requisies do navegador ou aparelho do cliente Armazene dados especficos da sesso atual do usurio entre vrias requisies do cliente Trate eventos relacionados a sesso do usurio apropriadamente Automaticamente libere dados de sesso caso o usurio no revisite a aplicao aps um tempo determinado

Voc pode acessar o objeto que armazena as informaes de sesso atravs da propriedade Session do objeto pgina. Uma sesso em ASP.NET possui um ID nico. O ID uma string de 120 bits contendo caracteres ASCII. Os valores para o ID so gerados utilizando um algoritmo que garante que os Ids no colidam, e sejam aleatrios de forma que usurios maliciosos no possam adivinhar qual ser o prximo ID a ser gerado (e assim roubar a sesso de um usurio autorizado). Os Ids de sesso podem ser visualizados na propriedade SessionID do objeto Session, e so transferidos de cliente para servidor via cookies, ou via uma string de consulta no endereo requisitado, dependendo das configuraes feitas para a aplicao. As configuraes de aplicao referentes a sesso so feitas no arquivo Web.config da aplicao (ou globalmente para todas as aplicaes, no arquivo Machine.config). O elemento que configura estados de sesso neste arquivo sessionState. Por exemplo: <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 120

T u t o r i a l d e A S P. N E T

As duas principais propriedades aqui so cokieless e timeout. cokieless indica se o ID de sesso do usurio deveria ser enviado via cookie (true) ou via string de consulta (false). timeout indica o tempo que a sesso do usurio dever expirar em caso de no haver atividades (em minutos). A propriedade mode indica onde deve ser armazenado os valores de variveis de sesso. A configurao padro Inproc, ou seja, a varivel pertence ao processo da aplicao. a que possui menos sobrecarga de processamento, mas no indicada para aplicaes multiprocesso. Outras opes so StateServer: utilizado para quando voc utiliza um servidor com mais de um processador, e SQLServer: utilizado para quando voc utiliza mais de um servidor. O exemplo da listagem 7.5 idntico ao anterior, a no ser pelo fato de que ele armazena os valores em variveis de sesso. Dessa forma, duas sesses possuem valores diferentes. Listagem 7.5: Uso de estado de sesso

Arquivo Listagem07_05.aspx

<%@ Page language="c#" Codebehind="Listagem07_05.aspx.cs" AutoEventWireup="false" Inherits="Licao07.Listagem07_05" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem07_05</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Label id="lbl" style="Z-INDEX: 103; LEFT: 24px; POSITION: absolute; TOP: 16px" runat="server">Acessos:</asp:Label> <asp:Label id="lblAcessos" style="Z-INDEX: 101; LEFT: 88px; POSITION: absolute; TOP: 16px" runat="server"></asp:Label> <asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 24px; POSITION: absolute; TOP: 48px" runat="server" Text="Limpar" Width="72px"></asp:Button> <asp:Button id="Button2" style="Z-INDEX: 104; LEFT: 192px; POSITION: absolute; TOP: 16px" runat="server" Text="Requisitar"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 105; LEFT: 32px; POSITION: absolute; TOP: 80px" runat="server">ID de Sesso</asp:Label> <asp:Label id="lblIDSessao" style="Z-INDEX: 106; LEFT: 128px; POSITION: absolute; TOP: 80px" runat="server"></asp:Label> </form> </body> </HTML>

Arquivo Listagem07_05.aspx.cs System; System.Collections; System.ComponentModel; System.Data;

using using using using

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 121

T u t o r i a l d e A S P. N E T

using using using using using using

System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Licao07 { public class Listagem07_05 : System.Web.UI.Page { protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Label lblAcessos; protected System.Web.UI.WebControls.Button Button2; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label lblIDSessao; protected System.Web.UI.WebControls.Label lbl; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here if (Session["Acessos"] == null) Session["Acessos"] = 0; else Session["Acessos"] = (int) Session["Acessos"] + 1; lblAcessos.Text = Session["Acessos"].ToString(); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Button2.Click += System.EventHandler(this.Button2_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { Session["Acessos"] = 0; } private void Button2_Click(object sender, System.EventArgs e) { lblIDSessao.Text = Session.SessionID; }

new new

Vantagens de estado de sesso

Facilidade de implementao.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 122

T u t o r i a l d e A S P. N E T

Eventos especficos de sesso. Os eventos de sesso (incio, fim) pode ser tratados editando-se o arquivo Global.asax. Durabilidade. Os dados de sesso de usurio podem sobreviver a restarts no servidor IIS porque os dados so armazenados em locais fora do espao do processo da aplicao Escalabilidade de plataforma. Os estados de sesso podem ser utilizados em multicomputadores, ou computadores multi-processados, otimizando cenrios de escalabilidade Estados de sesso funcionam bem com navegadores e aparelhos que no suportam cookies, porque possvel configurar as sesses para funcionarem sem cookies.

Desvantagens de estado de sesso

Performance. As variveis de sesso ficam em memria at que sejam liberadas ou substitudas, e isso pode afetar a performance do servidor. Variveis de sesso com grandes quantidades de dados podem afetar um servidor Web em cenrios de grande utilizao

Suporte a banco de dados Quando voc precisa armazenar grandes informaes de usurio, comum utilizar bancos de dados. A utilizao de bancos de dados particularmente interessante quando preciso armazenar informaes por um perodo de tempo grande, ou quando os dados precisam ser preservados mesmo com a reinicializao do servidor. A utilizao de bancos de dados normalmente feita junto com cookies. O usurio convidado a logar no sistema, o sistema verifica as credenciais informadas com os dados do banco, e gera um cookie para o cliente. Ento voc pode utilizar o cookie do cliente quando precisar obter informaes do usurio no banco. Ateno: Cookies podem ser lidos por usurio maliciosos. Nunca deixe informaes vitais trafegarem por meio de cookies. Se voc precisar armazenar alguma informao do usurio como, por exemplo, uma ID para os dados de cliente, utilize criptografia ou alguma lgica para evitar que as informaes internas do cliente sejam observadas. O uso de bancos de dados permite que voc:

Identifique unicamente uma mquina do usurio e associe-o a uma ID nica Mantenha dados relativos a uma ID nica. Voc pode utilizar a ID nica para recuperar dados relativos a essa ID nica. Voc pode modificar e acessar esses dados em qualquer ponto de sua aplicao Manter dados relativos a um ID por muito tempo. Bancos de dados permitem dar persistncia aos dados, mesmo com a reinicializao do servidor.

As lio 5 mostra alguns exemplos de como voc pode utilizar bancos de dados com pginas ASP.NET. Vantagens do suporte a banco de dados

Segurana. O acesso a bancos de dados normalmente muito seguro, necessitando de autorizao e autenticao Capacidade. Voc pode guardar a quantidade de informao que quiser no banco de dados Persistncia. Os bancos de dados podem guardar a informao durante o tempo que voc quiser

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 123

T u t o r i a l d e A S P. N E T

Robustez e integridade de dados. Bancos de dados permite armazenamento de estruturas complexas, com controle de dados Acessibilidade. Os dados armazenados no banco ficam disponveis a qualquer aplicao necessria. Por exemplo, pode haver uma outra aplicao que l os dados de usurio de uma loja web no banco de dados e gera relatrios de padres de consumo. Suporte amplo. Existe uma grande variedade de ferramentas disponveis de bancos de dados

Desvantagens do suporte a banco de dados


Complexidade: Usar uma estratgia com suporte a bancos de dados implica em software e hardware mais complexo Performance. Estratgias pobres de acesso a banco de dados pode degradar muito a performance da aplicao.

Redirecionando usurios para outra pgina Voc pode querer redirecionar os usurios de um Web Form para outro. Isso feito em vrias situaes, como fazer um cadastro complexo, ou redirecionar o usurio para uma rea do site que combine com suas preferncias de linguagem. H dois modos de redirecionar pginas:

Usando um mtodo baseado em servidor. Neste caso, durante o processamento da pgina de origem, a execuo da aplicao transferida para outra pgina. A vantagem disso que voc pode acessar dados da pgina anterior na pgina de destino. A desvantagem que o servidor no notificado da transferncia, e, por isso, o histrico do navegador no atualizado. Usando o navegador. Neste caso, a pgina de origem envia um sinal para o navegador abrir uma outra pgina. A vantagem que o histrico do navegador atualizado. A desvantagem que este cenrio executa um roundtrip extra, o que pode afetar a performance.

Redirecionando pginas via servidor Chame o mtodo Server.Transfer(), passando a pgina que voc quer como argumento. O cdigo abaixo mostra como fazer isso: private void Button1_Click(object sender, System.EventArgs e) { Server.Transfer(Webform2.aspx); } Redirecionando pginas via navegador Configure a propriedade BufferOutput do objeto Response para true. Depois, chame o mtodo Response.Redirect(), passando a pgina a ser redirecionada como argumento. O cdigo abaixo mostra como fazer isso: Response.BufferOutput = true; if (UserLanguage == English) { Response.Redirect(look.html);

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 124

T u t o r i a l d e A S P. N E T

} else if (UserLanguage == Deutsch) { Response.Redirect(look_deu.html); } else if (UserLanguage == Espaol) { Response.Redirect(look_esp.html); }

Sumrio Nesta lio, so tratados mostradas as formas como voc pode manter dados de usurio entre diversas requisies de pgina. Voc ir fazer isso quando precisar implementar, na sua aplicao:

Simplicidade de uso: Cadastros complexos podem ser quebrados em diversas partes para facilitar o uso pelo usurio. Os dados precisam ser mantidos entre as diversas partes do cadastro. Em lojas eletrnicas, voc vai querer utilizar a metfora do carrinho de compras, as quais o usurio est j bem acostumado. Voc ir precisar salvar os produtos que ele escolher em um carrinho de compras. Segurana: Em algumas reas restritas da aplicao, voc ir precisar autenticar o usurio para que ele use a aplicao. Aps autenticado, ser necessrio armazenar uma informao que aquele usurio est logado. Personalizao: Sua aplicao pode armazenar preferncias de aparncia para cada usurio. Aps o usurio ser autenticado, voc ir querer manter as informaes de usurio mo, para gerar as pginas de acordo com suas preferncias. Minerao de dados: Informaes sobre a aplicao como perfil dos visitantes e utilizao da aplicao (pginas mais acessadas, nmero de cliques mdios para navegao, etc.) podem ser armazenados para consultas posteriores. O departamento de marketing pode querer ver informaes sobre as regies para onde os produtos esto sendo vendidos. O departamento de suporte pode querer visualizar onde o processo de venda est falho e poderia ser melhorado.

Para manter informaes entre requisies de pgina (e persistncia destes dados), voc pode utilizar duas abordagens: manter os dados no cliente, ou manter os dados no servidor. Em cada uma das abordagens h prs e contras, e vrias opes de implementao. Voc livre para escolher o melhor mtodo para cada caso.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 125

T u t o r i a l d e A S P. N E T

Lio 8: Utilizando scripts de cliente

Esta lio trata da utilizao de scripts Especificamente, os objetivos so:


de cliente includos

em Web Forms.

Entender como a relao dos Web Forms com scripts de cliente Aprender a incluir scripts de cliente em Web Forms Aprender os mecanismos de gerao de scripts via programao

Introduo Se voc sabe que os clientes de sua aplicao tem navegadores mais modernos, voc pode adicionar mais funcionalidade em suas pginas, ao incluir scripts de cliente que rodam no navegador, juntamente com os controles de servidor que voc use. Uma vez que os scripts de cliente rodam no navegador, voc pode inclu-los na pgina para manipular a aparncia de sua pgina e para responder mais rapidamente a certas aes do usurio. Alguns exemplos, de muitos, so: habilitar e desabilitar controles, responder a aes de mouse, animar elementos em pgina, etc. Como regra geral, scripts de cliente rodam inteiramente separados do cdigo de servidor que voc cria para seus Web Forms, e portanto, incluir scripts de cliente no Web Form no dever afetar a funcionalidade do seu cdigo no servidor. No entanto, alguns controles ASP.NET tambm possuem funcionalidade implementada em scripts de cliente, e importante entender a interao desses controles com seus scripts. Os controles ASP.NET que dependem de scripts de cliente so os seguintes:

Os controles LinkButton e HtmlButton necessitam de scripts. Mas isso no verdade para o WebControl Button, ou para os controles HtmlInputButton e HtmlInputImage. Por padro, o controle Calendar implementa a navegao de ms e dia utilizando controles LinkButton. Se o seu Calendar utilizar essas navegaes, o controle ir gerar os scripts necessrios. Se voc utilizar Calendar apenas para mostrar uma data e no utilizar navegao, scripts no so criados. Qualquer controle de servidor que utilize AutoPostBack igual a true ir gerar scripts de cliente para fazer o post da pgina no momento correto. Os controles de validao Web, que requerem validao no cliente, iro gerar scripts de cliente. Se o cliente no suportar scripts, a validao executada apenas no servidor.

Os scripts de cliente, nestes casos, so automaticamente gerados e enviados juntos com a pgina. compatvel com todos os navegadores que suportam pelo menos ECMAScript (JavaScript, JScript), e no dependem de DHTML. Os usurios s vezes desabilitam a execuo de scripts como medida de segurana. Neste caso, a funcionalidade dada pelos scripts perdida. Isto desabilita alguns controles inteiramente, como LinkButton, e desabilita a funcionalidade da propriedade AutoPostBack. Validao no desabilitada totalmente, apenas no ser imediata.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 126

T u t o r i a l d e A S P. N E T

Incluindo scripts de cliente em Web Forms H basicamente trs modos de se adicionar scripts de cliente em um Web Form:

Diretamente na pgina de layout do Web Form Atravs de programao, durante a execuo de um Web Form Gerando controles customizados que incluem scripts

Cada uma dessas alternativas tem seus usos, prs e contras. Essa lio mostrar quando e como utilizar cada uma. A criao de controles customizados, no entanto, um assunto avanado e foge ao escopo deste tutorial inicial, portanto ser abordada mais genericamente. Incluindo scripts de cliente em Web Forms Em tempo de layout, voc pode adicionar os scripts de cliente que precisar diretamente no cdigo ASP.NET. Os scripts podem ser adicionados:

Diretamente a um elemento, como resposta a um evento Dentro de elementos SCRIPT na pgina.

Essa tcnica no muda muito em relao a programao web convencional. No entanto, deve-se notar que nem todos os elementos de ASP.NET permitem setagem de eventos de cliente diretamente. Sendo mais especfico, os elementos que correspondem a controles Web (asp:button, asp:label, etc.) no podem receber eventos de cliente diretamente, porque eles no so elementos HTML. Em contrapartida, os controles HTML (aba HTML da Toolbox) podem receber diretamente porque so transformados diretamente em elementos HTML. Os elementos SCRIPT podem ser posicionados em quase todos os locais do cdigo, observando a visibilidade e escopo aplicados a cada local. Os elementos podem conter o script necessrio, ou relacionar um arquivo externo com os scripts. A vantagem de utilizar o relacionamento externo que o arquivo com os scripts pode fazer uso do cache do navegador. A vantagem de se utilizar script na pgina ASP.NET que evita chamadas extras ao servidor Web para obter toda a funcionalidade da pgina. Quando voc utiliza elementos HTML, os scripts podem ser alocados diretamente a eles via cdigo ASP.NET. De fato, Os controles HTML mapeiam quase que inteiramente os elementos HTML reais que vo gerar em tempo de execuo. Por exemplo, veja este HtmlInputButton: <INPUT style="Z-INDEX: 102; LEFT: 32px; WIDTH: 72px; POSITION: absolute; TOP: 120px; HEIGHT: 24px" type="button" value="Alerta" onclick="alert('clicou');"> Uma de suas propriedades onclick, que mapeado como o evento de onclick do elemento INPUT. Veja o elemento BODY desta pgina: <body MS_POSITIONING="GridLayout" onload="setaFoco();"> setaFoco() uma funo de script que foi adicionada dentro do cabealho (HEAD) da pgina: <script language="javascript" type="text/javascript">

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 127

T u t o r i a l d e A S P. N E T

<!--

//--> </script>

function setaFoco() { var e = document.all.txtNome; if (e) e.focus(); }

Incluindo scripts atravs de programao Para controles Web, a tcnica de adicionar scripts para responder eventos de elementos no funciona. Isso acontece porque os controles Web, apesar de terem uma sintaxe de declarao semelhante a HTML, no so elementos HTML. No entanto, possvel adicionar eventos para os elementos que eles geram. Todo controle Web possui uma propriedade chamada Attributes. Attributes uma lista de valores no formato par chave/valor. O contedo de Attributes renderizado como propriedades do elemento HTML de nvel mais superior que o controle gera. Voc pode adicionar valores quando desejar nesta coleo. Por exemplo, seja um controle Label chamado Label1. Se executarmos a seguinte rotina no evento de Load da pgina: private void Page_Load(object sender, System.EventArgs e) { Label1.Attributes.Add("onmouseenter", "this.style.color = 'red'"); Label1.Attributes.Add("onmouseleave", "this.style.color = 'black'"); } O HTML gerado ser: <span id="Label1" onmouseenter="this.style.color onmouseleave="this.style.color = 'black'">Nome</span> = 'red'"

Mesmo os controles HTML, se estiverem rodando em servidor (runat=server), podem ser programados para gerar o script correto. A configurao de eventos de cliente feita tambm atravs da propriedade Attributes. Por exemplo, seja um HtmlInputButton rodando no servidor. Se desejarmos configurar o evento de click em cliente, basta adicionar o seguinte comando: Button1.Attributes.Add("onclick", "alert('clicou tambm');"); ASP.NET possui um suporte maior para gerao de scripts de cliente, no entanto. Ela possui alguns mtodos que permitem ao desenvolvedor criar scripts de cliente em determinados pontos da pgina do cliente. Todos esses mtodos pertencem ao objeto pgina. A tabela abaixo mostra todas as funes relacionadas a scripting:

Mtodo

Descrio

Quando usar Quando preciso incluir funes de script (ou biblioteca de funes) que contenham funes gerais e podem ser utilizadas em qualquer ponto da pgina.

RegisterClientScriptB Permite ao programador lock() escrever um bloco de script (contendo script ou referncia para biblioteca de scripts). O bloco criado no incio da pgina e identificado por uma chave.
Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 128

T u t o r i a l d e A S P. N E T

Mtodo

Descrio

Quando usar Quando preciso incluir um script, ou biblioteca de funes, que faam referncias a elementos da pgina. Normalmente usado para inicializar variveis e elementos.

RegisterStartupScript Permite ao programador escrever um bloco de script (contendo script ou referncia para biblioteca de scripts). O bloco renderizado no fim da pgina e identificado por uma chave.

RegisterArrayDeclarat Permite criar e inicializar um Algumas rotinas podem ion array na pgina. O array precisar de um array de escopo registrado com um nome, global. que usado como chave. RegisterOnSubmitState Associa uma funo para o ment evento de onsubmit do formulrio da pgina, e o associa a uma chave. Quando preciso que um que uma funo seja chamada antes de o formulrio ser submetido.

IsClientScriptBlockRe Verifica se um script com Usado para determinar se gistered uma determinada chave j foi RegisterClientScriptBlock registrado como bloco de precisa ser chamado. script. IsStartupScriptRegist Verifica se um script com Usado para determinar ered uma determinada chave j foi RegisterStartupScript registrado como script de precisa ser chamado. inicializao. RegisterHiddenField Permite registrar um campo tipo hidden na pgina do controle. Este campo pode ser acessado por script de cliente e fica disponvel para o servidor como dado de postback. se

Algumas rotinas podem precisar de um local para armazenar valores. O contedo do campo pode ser visualizados no servidor, quando ocorre um postback.

Os mtodos RegisterClientScriptBlock(), ClientStartupScript(), RegisterArrayDeclaration() e RegisterOnSubmitStatement() sempre associam o script (ou array) gerado com uma chave. Assim, se em dois pontos da pgina voc tentar registar um item com a mesma chave, o ASP.NET no repete as declaraes. Por exemplo, se voc chamar RegisterClientScriptBlock() para imprimir uma funo duas vezes com a mesma chave, a segunda chamada ignorada. Os mtodos IsClientScriptBlockRegistered() e IsClientStartupScriptRegistered() verificam se j foi registrado na pgina um script com uma chave. Os mtodos que registram scripts de cliente no declaram a tag SCRIPT. Assim, voc precisa ficar atento para gerar corretamente os scrips dentro destas tags para que eles funcionem corretamente. No exemplo abaixo mostrado um exemplo de como RegisterClientScriptBlock() pode ser utilizado. RegisterClientScriptBlock("alerta", @"<script language=""javascript"" type=""text/javascript""> <!-function alerta()
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 129

T u t o r i a l d e A S P. N E T

{ alert(""ol""); } //--> </script>"); Neste caso, criado um bloco de script que possui uma funo chamada alerta, e com o mtodo RegisterClientScriptBlock(), ele escrito no incio da pgina. O bloco registrado com o nome alerta. Gerando componentes customizados Uma das desvantagens de se utilizar a tcnica anterior a limitao da reusabilidade do cdigo de script. Por exemplo, se voc cria um script para implementao de mscara, e coloca em sua pgina, voc precisa associar cada controle que utiliza o script com cdigo de programao. Se, por deciso de projeto, a mscara deve ser removida, voc precisa lembrar de remover o script e fazer as desassociaes necessrias. Controles do ASP.NET como LinkButton, que utilizam scripts de cliente, no possuem esse problema. Se voc adicionar um controle na pgina, o script que realiza a funcionalidade automaticamente criado. Se voc remover o controle, o script automaticamente removido da pgina. Se voc adicionar mais de um controle do mesmo tipo, seus scripts no sero duplicados. Como fazer isso? Basicamente, todos os controles Web so classes que herdam da classe WebControl. WebControl j implementa algumas propriedades, eventos e mtodos que fazem parte da arquitetura ASP.NET de pginas web. Por exemplo WebControl possui um mtodo protegido chamado Render(). Em tempo de execuo, o framework chama os mtodos Render() de todos os controles. A inteno fazer com que o controle gere o HTML necessrio para ser mostrado na tela. neste momento em que o desenvolvedor pode gerar scripts de cliente. Basta criar uma nova classe, herdando do controle que se deseja modificar, e sobrescrever o mtodo Render() padro do controle base para gerar scripts de cliente. Para gerar scripts de cliente, basta executar os mtodos mostrados na sesso anterior, atravs da referncia Page, que todo WebControl possui. Depois de implementado, seu novo controle ir agir como os outros controles de ASP.NET, gerando scripts de cliente apenas quando necessrio e automaticamente. Se voc no entendeu completamente esta ltima sesso, no se preocupe no o objetivo desta lio ensinar todas as etapas da construo de um controle customizado. Mais informaes podem ser encontradas na sesso Developing ASP.NET Server Controls, disponvel na documentao do Framework .NET.

Escolhendo o mtodo de gerao de scripts de cliente Cada tcnica possui vantagens e desvantagens. Voc vai querer incluir os scripts diretamente na pgina de layout quando:

Voc estiver com pressa Voc estiver passando uma pgina HTML para ASP.NET rapidamente Voc quiser ter mais controle de onde criar seus scripts

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 130

T u t o r i a l d e A S P. N E T

Os scripts no precisam mudar em tempo de execuo no servidor

Voc ir querer incluir scripts via programao quando:


Seus scripts so mutveis, eles podem mudar durante a execuo da aplicao Voc est utilizando Controles Web Voc prefere manter a programao em um loca apenas

Voc ir querer gerar controles customizados:


Sua lgica de script complexa Voc tem muito tempo Voc deseja reaproveitar seu esforo

O programa da listagem 8.1 mostra um pequeno exemplo onde so gerados scripts com diferentes tcnicas. Listagem 8.1: Utilizao de scripts de cliente

Arquivo Listagem08_01.aspx

<%@ Page language="c#" Codebehind="Listagem08_01.aspx.cs" AutoEventWireup="false" Inherits="Licao08.Listagem08_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem08_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <script language="javascript" type="text/javascript"> <!-function setaFoco() { var e = document.all.txtNome; if (e) e.focus(); } //--> </script> </HEAD> <body MS_POSITIONING="GridLayout" onload="setaFoco();"> <form id="Form1" method="post" runat="server"> <asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 40px" runat="server">Nome</asp:Label> <INPUT style="Z-INDEX: 102; LEFT: 32px; WIDTH: 72px; POSITION: absolute; TOP: 120px; HEIGHT: 24px" type="button" value="Alerta" onclick="alert('clicou');">&nbsp; <asp:TextBox id="txtNome" style="Z-INDEX: 103; LEFT: 80px; POSITION: absolute; TOP: 40px" runat="server"></asp:TextBox><INPUT style="Z-INDEX: 104; LEFT: 120px; WIDTH: 104px; POSITION: absolute; TOP: 120px; HEIGHT: 24px" type="button" value="Outro alerta" runat="server" id="Button1"> </form> </body> </HTML>

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 131

T u t o r i a l d e A S P. N E T

Arquivo Listagem08_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

namespace Licao08 { public class Listagem08_01 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox txtNome; protected System.Web.UI.HtmlControls.HtmlInputButton Button1; protected System.Web.UI.WebControls.Label Label1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here Label1.Attributes.Add("onmouseenter", "this.style.color = Label1.Attributes.Add("onmouseleave", "this.style.color = Button1.Attributes.Add("onclick", "alerta();"); RegisterClientScriptBlock("alerta", @"<script language=""javascript"" type=""text/javascript""> <!-function alerta() { alert(""ol""); } //--> </script>"); } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion

'red'"); 'black'");

Sumrio

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 132

T u t o r i a l d e A S P. N E T

Nesta lio voc aprendeu como incluir scripts de cliente em Web Forms. Voc pode inserir scripts diretamente na pgina de layout ou atravs de programao. Alternativamente, voc pode componentizar sua lgica em controles customizados.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 133

T u t o r i a l d e A S P. N E T

Lio 9: Controlando dados de requisio e resposta

Esta lio contm informaes sobre o controle de dados de requisio e de resposta do servidor Web. Os objetivos so os seguintes:

Entender como feita a comunicao entre servidor e cliente Entender como ASP.NET modulariza dados de requisio e resposta Se familiarizar com o objeto Request Se familiarizar com o objeto Response

Introduo Quando criamos uma aplicao Web, e nos envolvemos nos minimalismos de fazer uma boa interface com o cliente, e gerar uma boa aplicao no servidor, muitas vezes perdemos a noo de como as coisas realmente acontecem. Basicamente, uma aplicao Web consiste na comunicao entre duas entidades: um cliente - que pode ser um navegador de pginas HTML em um PC ou um aparelho especializado (a porta de uma geladeira, por exemplo) - e um servidor que normalmente um computador ou um conjunto de computadores disponveis a executar determinadas instrues. Essa uma viso simplista, na verdade uma aplicao Web pode ter mais camadas alm dessas, como um servidor de banco de dados, um servidor para autenticar usurios, um servidor para gerenciar a aplicao, um servidor para gerenciar servidores, e outros. Nesta lio, no entanto, estaremos focando os estudos apenas na comunicao entre o servidor da aplicao e o cliente usurio da aplicao. A comunicao entre as duas camadas, a despeito da complexidade da nossa aplicao, bastante simples. Trata-se apenas de mensagens enviadas do servidor para o cliente e vice-versa. O meio de comunicao pode ser qualquer meio de transporte, de fato, desde que a mensagem possa ser compreendida no destino da forma como foi enviada na origem. Normalmente utiliza-se uma rede de computadores com baixo tempo de espera. Para que a mensagem possa ser entendida por ambas as partes, elas utilizam um protocolo: uma linguagem que ambas possam entender, no importando o pas, a arquitetura do computador, o fabricante das partes. Para realizar essa comunicao, os protocolos comumente utilizados so o Hyper Text Transfer Protocol (HTTP) e HTTP Secure (HTTPS). As mensagens em HTTP consistem em duas partes: cabealho e corpo. No cabealho normalmente vo informaes de controle, informaes sobre o contedo do corpo, e informaes extras que no so exatamente relacionados com o corpo. O cabealho normalmente tem um tamanho nfimo em relao ao corpo, sendo de apenas alguns bytes. No corpo est o contedo real da mensagem, o motivo pelo qual a mensagem est sendo enviada. Uma boa ferramenta para visualizao das mensagens HTTP entre cliente e servidor o Fiddler (www.fiddlertool.com). Fiddler um sniffer de HTTP que funciona no cliente. Ele captura as mensagens de sada e de entrada, e permite visualizar tanto o cabealho quanto o corpo da mensagem, de uma forma bastante ituitiva.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 134

T u t o r i a l d e A S P. N E T

As mensagens diferem bastante dependendo do sentido da comunicao. Quando a mensagem sai do cliente em direo ao servidor, normalmente leva informaes sobre o cliente: plataforma de sistema operacional, identificador do navegador, arquivos aceitos pelo cliente, etc. A principal informao, no entanto, um URL: Universal Resource Locator. Ele indica exatamente para onde deve ir a mensagem (arquivo, diretrio, mquina). Em alguns casos, a mensagem pode levar dados fornecidos pelo usurio. A mensagem que sai do cliente chamada de Requisio (Request). Quando a mensagem sai do servidor em direo a um cliente, sempre em resposta a uma requisio. Nenhuma mensagem sair de um servidor para um cliente sem que seja estritamente requisitado pelo cliente. Portanto, a mensagem que sai do servidor recebe o nome de Resposta (Response). A mensagem de resposta no possui URL (uma vez que uma resposta a uma requisio j identificada), mas da mesma forma que a requisio, pode possuir informaes sobre o servidor (plataforma, identificador do servidor HTTP) e informaes sobre o corpo (tamanho da mensagem, tipo da mensagem). O corpo da resposta, normalmente, tende a ser grande. Ele gerado a partir do processamento da requisio pelo servidor. s vezes, a requisio simples e o nico processamento que deve ser feito obter o arquivo requisitado no sistema de arquivos e enviar para o cliente (como o caso de imagens, udio, arquivos em geral, pginas HTML estticas). Na maioria das requisies para aplicaes Web, no entanto, o corpo o resultado do processamento dos dados fornecidos pelo usurio. Esse processamento pode incluir: acessar banco de dados, gerar pginas HTML, gerar um relatrio em PDF e enviar um e-mail para o administrador, entre outros. Em resumo, criar uma aplicao Web , do lado do cliente, fornecer informaes valiosas para o cliente, e dar suporte para que ele nos envie informaes que precisamos; do lado do servidor, receber as informaes do cliente e process-las de forma que satisfaa nossa aplicao, para retornar boas respostas ao cliente.

O modelo ASP.NET Para o servidor Web, as nicas coisas importantes so a mensagem de requisio e a mensagem de resposta. As ferramentas que permitem processar as requisies para gerar respostas existem para que deixem simples para o desenvolvedor programar sua lgica. ASP.NET uma arquitetura que supre esse nicho. O servidor Web configurado para que, quando o URL indicado por uma requisio tiver extenso .aspx, o framework ASP.NET entre em ao. Para o servidor Web, tudo funciona assim: 1. 2. 3. 4. Recebi uma requisio para um arquivo aspx Vou passar a mensagem de requisio para o framework ASP.NET Espero o framework ASP.NET me entregue a mensagem de resposta Depois que a mensagem de resposta estiver pronta, a envio para o cliente

O framework ASP.NET relativamente complexo, se pensarmos em como ele apresenta para ns, desenvolvedores, os dados de requisio. Existem os objetos TextBox com dados digitados pelos usurios, DropDownLists com valores selecionados, e Calendars com meses ativos. No se deixe enganar, no entanto: nenhum desses objetos veio do cliente eles so criados e destrudos no curtssimo espao de tempo entre a requisio do cliente e a resposta do servidor. Os dados que os controles possuem so inseridos pelo framework quando os objetos so criados. Funciona mais ou menos assim:
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 135

T u t o r i a l d e A S P. N E T

1. Uma classe de servidor pgina X possui um controle de servidor TextBox chamado txt_nome. 2. O servidor Web recebe uma requisio para a pgina X, contendo uma informao: txt_nome=Teste. 3. O servidor Web aciona o framework ASP.NET e passa para ele a requisio. 4. O framework instancia dois objetos: um para tratar a requisio e outro para tratar a resposta (falaremos deles em 5 minutos). 5. O framework popula o objeto de requisio com as informaes recebidas da mensagem de requisio. 6. O framework instancia o objeto pgina X referenciado pela requisio. O objeto TextBox, como um atributo do objeto pgina, instanciado tambm. 7. O framework observa que possui um dado vindo do cliente. O dado txt_nome=Teste. 8. O framework verifica se a pgina possui algum objeto chamado txt_nome. Ele descobe que um TextBox. 9. O framework passa para o TextBox o valor Teste. O TextBox, que dono de si mesmo, inicializa sua propriedade Text com o valor passado pelo framework. 10. Outras coisas acontecem. Entre elas, os eventos de pgina (Load) e de controles (Click, Command, TextChanged, etc.). 11. O framework envia para todos os controles uma mensagem dizendo: hora de acabar, vamos gerar HTML. Ele envia como argumento da mensagem (no caso, o mtodo Render()) o objeto de reposta. 12. O objeto TextBox recebe a mensagem. Ele escreve no objeto de resposta o seguinte: <input type=text value=Test>. 13. O framework, depois que todos os controles e a pgina geraram HTML em seu objeto de resposta, destri o objeto pgina. O objeto TextBox, que era um atributo da pgina, destrudo tambm. 14. O framework serializa o objeto de resposta, ou seja, transforma seu contedo em uma string nica. Essa string a mensagem de resposta. 15. O framework envia a mensagem de resposta para o servidor Web. 16. O servidor Web envia a mensagem de resposta para o cliente. Tudo isso acontece em um piscar de olhos. E a cada requisio. O incio um texto com a mensagem de requisio, e o fim uma string com a mensagem de resposta. Embora ns, desenvolvedores ASP.NET, utilizamos basicamente os objetos que criamos na pgina (TextBox, CheckBox e etc.) podemos acessar os dados de requisio e resposta, incluindo corpo e cabealho. ASP.NET facilita nossa vida, mapeandos as mensagens em objetos .NET (ver passo 4). Esses objetos so acessados globalmente em nossa aplicao, atravs dos objetos Request e Response.

O objeto Request O objeto Request um atributo de toda pgina ASP.NET. Ele do tipo System.Web.HttpRequest e mapeia a requisio do cliente. Se voc quiser salvar o contedo da requisio, pode chamar seu mtodo SaveAs(). O melhor ponto para comear a estudar o objeto Request justamente o URL. O objeto Request d acesso ao URL de vrias formas:

Propriedade RawUrl: Uma string que indica a caminho at o recurso requisitado, incluindo seu nome. No inclui o nome do servidor.
Documento: TIPX-1 Pgina 136

Cuiab, 23 de Agosto de 2005, 12:17

T u t o r i a l d e A S P. N E T

Propriedade Url: Um objeto do tipo System.Uri que d maiores informaes sobre o URL requisitado. Contm o nome do servidor, o caminho at o recurso (como visto pelo cliente), o caminho do recurso (como visto pelo servidor), a porta de comunicao, a string de consulta do URL, etc. Propriedade QueryString: Uma coleo de itens na forma par chave/valor, contendo as informaes enviadas pelo cliente atravs da string de consulta. A string de consulta o contedo que vm depois do primeiro ponto de interrogao (?) no URL. Propriedade ApplicationPath: Indica o diretrio raiz da aplicao ASP.NET a qual o URL pertence. Propriedade CurrentExecutionPath: Indica qual o recurso que est sendo executado no momento.

O segundo dado mais importante de uma mensagem de requisio o mtodo de envio de dados via HTTP. Eles so trs:

GET: Indica que os dados esto sendo enviados via string de consulta, junto com o endereo do URL. HEAD: Indica que os dados esto sendo enviados dentro do cabealho de dados. POST: Indica que os dados esto sendo enviados no corpo da mensagem de requisio.

possvel ver qual o mtodo de envio da requisio atravs da propriedade HttpMethod. possvel ter acesso aos cabealhos da requisio atravs da propriedade Headers. Essa propriedade uma coleo de dados na forma par chave/valor indicando todos os cabealhos e seus valores da requisio. Alguns cabealhos so comumente acessados e foram promovidos a propriedades de primeira ordem no objeto Request. So eles:

AcceptTypes: tipos de arquivos aceitados pelo cliente ContentEncoding: codificao de caracteres utilizada para o envio da mensagem ContentLenght: tamanho do corpo da mensagem ContentType: tipo dos dados enviados no corpo da mensagem Cookies: uma coleo de cookies enviados pelo cliente UrlReferer: indica a URL que referenciou a URL atual. Na prtica, indica a pgina que referenciou a pgina atual (como uma pgina que possui IFRAME) UserAgent: identificador do navegador do cliente UserLanguages: linguagens suportadas pelo cliente

Quando os dados so enviados via mtodo POST, eles podem ser visualizados na propriedade Form. Form uma coleo de valores na forma par chave/valor. Se os dados foram enviados por um formulrio, por exemplo, cada posio do formulrio ter um valor de formulrio enviado. Se o formulrio enviou arquivos, cada arquivo poder ser obtido na propriedade Files. Files uma coleo de objetos do tipo HttpPostedFile, que contm o contedo do arquivo, seu tipo, seu nome e seu tamanho. Algumas propriedades do objeto Request so fornecidas pelo servidor Web. So elas:

Browser: Um objeto que possui informaes detalhadas sobre o navegador do cliente, como, por exemplo, suporte a script, verso de HTML suportada, suporte a frames, etc. IsAuthenticated: informa se o usurio foi autenticado pelo servidor Web
Documento: TIPX-1 Pgina 137

Cuiab, 23 de Agosto de 2005, 12:17

T u t o r i a l d e A S P. N E T

IsSecure: informa se a conexo segura, ou seja, HTTPS TotalBytes: tamanho total da mensagem UserHostAddress: informa o IP do cliente UserHostName: informa o endereo DNS do cliente, se disponvel

O objeto Response O objeto Response um atributo de toda pgina ASP.NET. Ele do tipo System.Web.HttpResponse e mapeia a requisio do cliente. Ele utilizado principalmente para gerenciamento de cache. Como falaremos de cache em uma prxima lio, vamos focar nos outros usos do objeto Response. Trs propriedades afetam o contedo enviado pelo Response:

ContentEncoding: codificao de caracteres utilizado pelo corpo da mensagem ContentType: tipo do contedo enviado no corpo da mensagem StatusCode, StatusDescription: permite configurar o cdigo de status HTTP enviado para o cliente (e sua descrio). Exemplo: 404 Not Found SupressContent: indica se o processamento vai enviar dados para o cliente

Para transmitir arquivos, utiliza-se um dois seguintes mtodos:


BinaryWrite(): escreve um array de bytes na sada para o cliente TransmitFile(): envia um arquivo do sistema de arquivos para o cliente WriteFile(): escreve arquivos para sada em uma variedade de opes

Os cabealhos de sada no so iteiramente disponveis. possvel limpar todos os cabealhos com ClearHeaders(), e adicionar novos cabealhos com AppendHeader(). possvel controlar a requisio da seguinte forma:

Mtodo End(): Encerra a requisio, envia a mensagem de resposta para o cliente e lana o evento End_Request Mtodo Close(): Fecha a conexo com o cliente Propriedade IsClientConnected: Indica se o cliente ainda est conectado.

O objeto Response possui ainda propriedades e mtodos para trabalhar com cookies, mas dedicaremos uma lio aos cookies na prxima lio.

Sumrio Nesta lio, exploramos os objetos de requisio e resposta, da comunicao entre o cliente e servidor da pgina Web. O objeto de requisio (Request) basicamente trata dos dados enviados pelo cliente. O objeto de resposta (Response) basicamente controla como as informaes sero enviadas para o cliente.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 138

T u t o r i a l d e A S P. N E T

Lio 10: Utilizao de cookies

As lies anteriores sobre controle de dados de requisio e resposta e manuteno de dados de seo tocou no assunto de cookies. Esta lio ir abordar os cookies. Os objetivos so os seguintes:

Mostrar o que so cookies Como os cookies podem ser utilizados Como tratar cookies com ASP.NET

Introduo Um cookie uma informao que pode ser enviada para o navegador do cliente. No cliente, ele pode ficar em memria ou ser persistido no sistema de arquivos. O cliente sempre manda os cookies que enviamos para ele quando requisita um recurso do servidor. Um cookie possui as seguintes caractersticas:

uma informao que possui um nome e um valor Normalmente pequeno, a maioria dos navegadores suportam apenas cookies de 4096 bytes de tamanho Um cookie tem a assinatura do domnio (servidor) que enviou o cookie Um cookie enviado apenas para o domnio que o criou Um cookie tem uma validade, depois de expirada a validade, o cliente o exclui.

Por causa dessas caractersticas, cookies so normalmente utilizados para armazenar o ID de sesso do usurio no banco, e assim, servir de chave para obter mais informaes que normalmente so gravadas no objeto de sesso do usurio. De fato, o comportamento padro de ASP.NET permitir sesses indexadas por um ID, que enviado para o cliente como um cookie. Se voc possui o Fiddler instalado em sua mquina observe as requisies para uma pgina ASP.NET com sesso. Voc vai observar a transferncia de um cookie chamado ASP.NET_SessionId. Esse cookie gerado automaticamente quando uma nova sesso de usurio criada.

Cookies em ASP.NET Em alguns casos, voc ir querer criar seus prprios cookies. ASP.NET mapeia um cookie como o objeto System.Web.HttpCookie. A classe HttpCookie possui as seguintes propriedades:

Domain: o domnio associado ao cookie Expires: a data de expirao do cookie Name: nome do cookie Value: valor associado ao cookie Secure: indica se o cookie deveria ser ser enviado apenas sobre conexes seguras HTTPS

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 139

T u t o r i a l d e A S P. N E T

Essas so as principais propriedades, as quais voc pode estar manipulando. Mas e como criar e ler cookies? Para fazer isso voc acessa mtodos dos objetos Response e Request. Criar cookies Para criar cookies, voc precisa escrever novos cookies no objeto de resposta (Response). Response possui uma propriedade chamada Cookies, que uma coleo de cookies a serem gravados no cliente. Um mtodo para gravar um cookie poderia ser o seguinte: private void Button1_Click(object sender, System.EventArgs e) { Response.Cookies[txtNome.Text].Value = txtValor.Text; } Simples e fcil. Como indexador, voc utiliza o nome do cookie, e configura o valor do cookie. Voc pode utilizar o mtodo Add() para escrever novos cookies tambm. Para definir datas de expirao, voc pode utilizar a propriedade Expires do objeto cookie adicionado coleo, dessa forma: private void Button1_Click(object sender, System.EventArgs e) { Response.Cookies[txtNome.Text].Value = txtValor.Text; Response.Cookies[txtNome.Text].Expires = DateTime.Now.AddHours(1.0); } No exemplo acima, o cookie est sendo configurado para ser expirado dentro de 1 hora depois de criado. Ler um cookie Os cookies que so enviados pelo cliente podem ser lidos a partir de uma coleo chamada Cookies, que propriedade do objeto Request. Cookies uma coleo onde cada item um objeto HttpCookie. Cookies possui dois indexadores para cookies, um por posio e outro por nome de cookie. Se voc quiser preencher uma lista com todas os cookies enviados pelo cliente, voc pode criar um mtodo como este: ListBox1.Items.Clear(); HttpCookieCollection cookies = Request.Cookies; for (int i=0; i<cookies.Count; i++) ListBox1.Items.Add(cookies[i].Name +" "+ cookies[i].Value); Apagar um cookie Voc no apaga um cookie, na verdade. O que voc pode fazer configurar a data de expirao do cookie para expirar imediatamente e o navegador se encarrega de destrulo. O mtodo algo parecido com isso:

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 140

T u t o r i a l d e A S P. N E T

Response.Cookies[txtNome.Text].Expires = DateTime.Now.AddDays(-1); O programa da listagem 10.1 mostra como voc pode trabalhar com cookies. Listagem 10.1: Trabalhando com cookies

Arquivo Listagem10_01.aspx

<%@ Page language="c#" Codebehind="Listagem10_01.aspx.cs" AutoEventWireup="false" Inherits="Licao10.Listagem10_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem10_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <FORM id="Form1" method="post" runat="server"> <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 80px" runat="server" Text="Criar cookie"></asp:Button> <asp:TextBox id="txtNome" style="Z-INDEX: 107; LEFT: 128px; POSITION: absolute; TOP: 8px" runat="server"></asp:TextBox> <asp:TextBox id="txtValor" style="Z-INDEX: 102; LEFT: 128px; POSITION: absolute; TOP: 40px" runat="server"></asp:TextBox> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 8px" runat="server">Nome do cookie</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 104; LEFT: 16px; POSITION: absolute; TOP: 40px" runat="server">Valor do cookie</asp:Label> <asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 105; LEFT: 296px; POSITION: absolute; TOP: 8px" runat="server" ControlToValidate="txtNome" ErrorMessage="*"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator id="RequiredFieldValidator2" style="Z-INDEX: 106; LEFT: 296px; POSITION: absolute; TOP: 40px" runat="server" ControlToValidate="txtValor" ErrorMessage="*"></asp:RequiredFieldValidator> <asp:ListBox id="ListBox1" style="Z-INDEX: 108; LEFT: 24px; POSITION: absolute; TOP: 208px" runat="server" Rows="6"></asp:ListBox> <asp:Label id="Cookies" style="Z-INDEX: 109; LEFT: 24px; POSITION: absolute; TOP: 184px" runat="server">Cookies:</asp:Label> <asp:Button id="Button3" style="Z-INDEX: 110; LEFT: 24px; POSITION: absolute; TOP: 152px" runat="server" Text="Ler cookies" CausesValidation="False"></asp:Button> <asp:Button id="Button2" style="Z-INDEX: 111; LEFT: 144px; POSITION: absolute; TOP: 80px" runat="server" Text="Remover cookie" CausesValidation="False"></asp:Button></FORM> </body> </HTML>

Arquivo Listagem10_01.aspx.cs

using System; using System.Collections; using System.ComponentModel;

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 141

T u t o r i a l d e A S P. N E T

using using using using using using using

System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

namespace Licao10 { public class Listagem10_01 : System.Web.UI.Page { protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2; protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.TextBox txtValor; protected System.Web.UI.WebControls.TextBox txtNome; protected System.Web.UI.WebControls.ListBox ListBox1; protected System.Web.UI.WebControls.Label Cookies; protected System.Web.UI.WebControls.Button Button3; protected System.Web.UI.WebControls.Button Button2; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { ListBox1.Items.Clear(); HttpCookieCollection cookies = Request.Cookies; for (int i=0; i<cookies.Count; i++) { ListItem item = new ListItem(cookies[i].Name +" "+ cookies[i].Value, cookies[i].Name); ListBox1.Items.Add(item); } } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Button2.Click += System.EventHandler(this.Button2_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { Response.Cookies[txtNome.Text].Value = txtValor.Text; Response.Cookies[txtNome.Text].Expires DateTime.Now.AddHours(1.0); } private void Button2_Click(object sender, System.EventArgs e) {
Cuiab, 23 de Agosto de 2005, 12:17 Documento: TIPX-1 Pgina 142

new new

T u t o r i a l d e A S P. N E T

Response.Cookies[txtNome.Text].Expires DateTime.Now.AddDays(-1); } } }

Sumrio Nesta lio voc aprendeu o que so cookies e como voc pode acess-los via ASP.NET. Voc pode criar novos cookies utilizando o objeto Response, e pode ler os cookies enviados pelo cliente utilizando o objeto Request.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 143

T u t o r i a l d e A S P. N E T

Lio 11: Configuraes de segurana

Nesta lio estaremos falando sobre as opes de segurana do ASP.NET. Em especial, essa lio tratar de:

Segurana de senhas Conexo com o usurio Validao de dados Controle de acesso (autenticao e autorizao)

Introduo Toda aplicao requer um nvel de segurana para ser aplicada. Essa segurana pode ser definida sobre vrios aspectos (segurana do ambiente de execuo, segurana dos dados do usurio, segurana da identidade do usurio, segurana do cdigo da aplicao, etc.). Isso quer dizer que quando discutido segurana, preciso ter em mente que h diferentes nveis e tipos de segurana. O tipo e nvel de segurana que a aplicao requer depende do tipo da aplicao e da quantidade de risco a que voc se sente confortvel.

Segurana de senhas A senha um artefato muito utilizado para autenticar o usurios. Ela parte da premissa de que apenas o dono da senha sabe qual a senha. Portanto, o sistema pode partir da premissa que, se o usurio preencheu corretamente seu nome a senha relacionada esse nome, ento o usurio autntico. Como desenvolvedores, podemos aumentar a confiabilidade do sistema de autenticar o usurio. Considere o seguinte sistema web: 1. O usurio digita sua senha em um campo de formulrio 2. O usurio clica em um boto para enviar a senha. Ela ser transportada via Internet 3. O sistema compara a senha com a senha cadastrada em um arquivo de senhas Parece um sistema lgico, mas na verdade ele possui graves falhas de segurana. Pelo menos trs falhas podem ser detectadas: 1. Fazer o usurio digitar em um campo protegido de cpias e com mscara no adianta: um invasor pode instalar um key logger, registrando todas as teclas sem o usurio saber 2. O protocolo HTTP no fornece nenhum sistema de proteo das informaes que so enviadas. Programas instalados na mquina do usurio, ou em algum ponto do caminho dos pacotes HTTP (por exemplo, na rede do condomnio) podem ler os dados do usurio, e suas senhas 3. Arquivos de senhas podem ser obtidos facilmente por invasores. Guardar senhas em bancos de dados no ajuda muito, principalmente se o banco de dados for utilizado por outras aplicaes

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 144

T u t o r i a l d e A S P. N E T

Claro que a escolha do nvel de segurana almejado pela aplicao depende do custo que se pretende gastar em segurana. Algumas solues, no entanto, so bastante baratas. Por exemplo, sempre armazene as senhas criptografadas, no importando o local. Bancos de dados so ideais, porque oferecem um nvel a mais de segurana, e porque voc j estar guardando tudo l mesmo. Uma forma bastante comum e segura de criptografar senhas para armazenamento utilizar algoritmos de via nica, tambm conhecidos como algoritmos de hash. Eles criptografam a senha de forma que no possa ser descriptografada. Assim, se um invasor colocar as mos na coleo de senhas, ele no poder fazer nenhuma operao ilegal. Assim, o que voc deve fazer :

Quando receber o cadastro de uma nova senha, voc deve criptografar a senha e gravar o resultado Quando receber uma senha para autenticar o usurio, voc deve criptografar a senha e verificar se o resultado o mesmo que o cadastrado

ASP.NET prov vrios algoritmos de hash para que voc possa criptografar suas senhas. Todas elas ficam no namespace System.Security.Cryptography. A mais conhecida a MD5, e vamos falar dela. A classe que criptografa dados com MD5 a MD5CryptoServiceProvider. Seu mtodo principal ComputeHash(). Ele um array de bytes em uma seqncia de 16 bytes. Voc pode criar um mtodo para criptografar senhas desta forma: private byte[] MD5Hash(byte[] dados) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] resultado = md5.ComputeHash(dados); return resultado; } S h um detalhe: senhas normalmente so recebidas como strings, e armazenadas como strings. Ento preciso transformar a string em um array de bytes para poder chamar MD5Hash(), e transformar o array de bytes que ele gera em uma string. Isso fcil. Todos os caracteres possuem um cdigo em bytes que o representam. Ento basta encontrar esse cdigo para gerar nosso array de bytes. Acontece que existem diversas codificaes diferentes e cada uma pode gerar cdigos diferentes para o mesmo caracter. Devemos escolher uma codificao para encontrar nosso array de bytes. A codificao escolhida realmente no importa, o importante manter a mesma codificao para evitar que problemas estranhos aconteam, como caracteres sendo trocados. Vamos escolher a codificao UTF8 para gerar nosso array de bytes. UTF8 o padro de codificao mais utilizado hoje em dia. Para acessar servios de UTF8, utilize a classe System.Text.UTF8Encoding. Um mtodo que chama MD5Hash para encodar uma string e gerar outra string criptografada : private void Button1_Click(object sender, System.EventArgs e) { UTF8Encoding encoder = new UTF8Encoding(); string origem = TextBox1.Text; byte[] destino = MD5Hash( encoder.GetBytes(origem) ); TextBox2.Text = encoder.GetString(destino);

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 145

T u t o r i a l d e A S P. N E T

} Normalmente, no entanto, voc no ir querer transformar seus hashes MD5 para strings para serem adicionados no banco de dados. Isso porque quase todos as codificaes de caracteres tratam o byte 0 como nulo, e caracteres nulos no so adicionados na string. Voc pode estar perdendo informaes. No banco de dados Oracle, utilize o tipo RAW. O programa da listagem 11.1 mostra como criptografar senhas. Listagem 11.1: Criptografando senhas

Arquivo Listagem11_01.aspx

<%@ Page language="c#" Codebehind="Listagem11_01.aspx.cs" AutoEventWireup="false" Inherits="Licao11.Listagem11_01" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem11_01</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 40px" runat="server"></asp:TextBox> <asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 200px; POSITION: absolute; TOP: 40px" runat="server" Text="Criptografar >>"></asp:Button> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server">Senha</asp:Label> <asp:Label id="Label2" style="Z-INDEX: 104; LEFT: 360px; POSITION: absolute; TOP: 16px" runat="server">Senha</asp:Label> <asp:TextBox id="TextBox2" style="Z-INDEX: 105; LEFT: 360px; POSITION: absolute; TOP: 40px" runat="server"></asp:TextBox> </form> </body> </HTML>

Arquivo Listagem11_01.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls; System.Security.Cryptography; System.Text;

using using using using using using using using using using using using

namespace Licao11 { public class Listagem11_01 : System.Web.UI.Page {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 146

T u t o r i a l d e A S P. N E T

protected protected protected protected protected

System.Web.UI.WebControls.TextBox TextBox1; System.Web.UI.WebControls.Button Button1; System.Web.UI.WebControls.Label Label1; System.Web.UI.WebControls.Label Label2; System.Web.UI.WebControls.TextBox TextBox2;

private void Page_Load(object sender, System.EventArgs e) { } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { UTF8Encoding encoder = new UTF8Encoding(); string origem = TextBox1.Text; byte[] destino = MD5Hash( encoder.GetBytes(origem) ); } TextBox2.Text = encoder.GetString(destino);

new

private byte[] MD5Hash(byte[] dados) { MD5CryptoServiceProvider md5 MD5CryptoServiceProvider(); byte[] resultado = md5.ComputeHash(dados); return resultado; } } }

new

Conexo com o usurio Mesmo se criptografarmos a senha, ainda assim um invasor poderia roubar a senha durante sua transmisso na internet. Isso acontece porque o protocolo HTTP no oferece nenhuma proteo para os dados. Uma das alternativas para proteger a conexo entre cliente e servidor utilizar um mtodo de criptografia de conexo. Esses mtodos fazem o seguinte: 1. Quando a mensagem for enviada, ela criptografada com um algoritmo reversvel 2. A mensagem transferida via internet 3. Quando a mensagem chega no destino, a mensagem descriptografada.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 147

T u t o r i a l d e A S P. N E T

A criptografia protegida por uma chave. Somente de posse desta chave que o destino pode descriptografar a mensagem. Sem a chave, os dados no passam de bits aleatrios. Portanto, um invasor, mesmo que obtenha todos os dados da conexo, no conseguir interpretar os dados, se no tiver a chave. A chave combinada no momento da conexo entre cliente e servidor, e normalmente muito grande (mais de 128 bits). Assim, fica virtualmente impossvel um invasor descriptografar a conexo por fora bruta (tentando todas as chaves possveis com 128 bits). O protocolo de criptografia mais utilizado o SSL (Secure Sockets Layer). possvel habilitar SSL para transmisso de dados da aplicao web atravs do gerenciador do IIS. Para isso, necessrio adquirir um certificado de identidade com alguma empresa de certificao.

Validao de dados A validao de dados do usurio tambm importante, e muitas vezes no tratada corretamente. Dados no validados so um problema em potencial para sua aplicao. Usurios mal intencionados podem inserir dados que podem gerar uma exceo no tratada. Por exemplo, entrar com uma string quando era esperado um nmero inteiro. Tratar as informaes na interface tampouco adianta. Como voc sabe, os dados so enviados atravs de mensagens para o servidor. Nada impede um hacker de gerar uma mensagem que contenha dados invlidos, tornando intil todo o trabalho que voc teve para validar os dados no navegador. Portanto, as validaes de dados precisam ser feitas no servidor. Podem (e devem, sempre que teis) ser feitas no cliente tambm, mas sero feitas pelo menos do servidor. Voc deve tratar toda entrada do usurio como maliciosa, a no ser que se prove o contrrio. E sempre deve-se aceitar apenas a entrada correta, e rejeitar tudo o mais. Em muitos casos, acreditamos ser mais simples rejeitar o que no queremos e aceitar todo o resto. Isto errado, e cria brechas de segurana. Quando voc rejeita a entrada incorreta, voc est declarando que sabe quais so todos os casos que podem gerar erro, e isso quase nunca acontece. Portanto, bem possvel que o usurio encontre meios de burlar a validao e inserir dados invlidos. Quando voc aceita apenas a entrada esperada, e rejeita todo o resto, voc est dizendo que s ir aceitar aquilo que voc sabe que no vai estragar seu sistema. Incrivelmente, esta uma tarefa bastante difcil. Em alguns casos, ser difcil encontrar o domnio de determinado dado. Especialmente quando voc espera receber grandes quantidades de texto que aparentemente podem conter qualquer coisa. A maneira mais usual de tratar erros de entrada utilizar expresses regulares. ASP.NET possui controles de validao (de servidor e cliente), em especial o RegularExpressionValidator, que permite a utilizao de expresses regulares para validar entrada. Se voc quiser fazer um sistema de validao customizado, pode utilizar a classe Regex, do namespace System.Text.RegularExpressions para testar entradas de usurio com uma expresso regular. Voc verifica combinao de uma entrada de usurio com uma expresso com o mtodo IsMatch(). Um mtodo para validar pode ser parecido com isso: private void Button1_Click(object sender, System.EventArgs e) {

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 148

T u t o r i a l d e A S P. N E T

Regex reg = new Regex(TextBox2.Text); if (reg.IsMatch(TextBox1.Text)) Label1.Text = "A expresso regular combina"; else Label1.Text = "A expresso regular no combina";

A sintaxe de expresses regulares em ASP.NET no muito diferente do padro de expresses regulares. No entanto, talvez voc precise entender o comportamento do engine de expresses regulares. Procure a documentao do .NET Framework por Regular Expression Language Elements. Um programa que testa entrada de usurio pode ser visto na listagem 11.2: Listagem 11.2: Expresses regulares

Arquivo Listagem11_02.aspx

<%@ Page language="c#" Codebehind="Listagem11_02.aspx.cs" AutoEventWireup="false" Inherits="Licao11.Listagem11_02" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Listagem11_02</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 80px; POSITION: absolute; TOP: 24px" runat="server"></asp:TextBox> <asp:TextBox id="TextBox2" style="Z-INDEX: 102; LEFT: 80px; POSITION: absolute; TOP: 80px" runat="server">^*$</asp:TextBox> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 24px; POSITION: absolute; TOP: 200px" runat="server"></asp:Label> <asp:Button id="Button1" style="Z-INDEX: 104; LEFT: 24px; POSITION: absolute; TOP: 136px" runat="server" Text="Validar"></asp:Button> <asp:Label id="Label2" style="Z-INDEX: 105; LEFT: 24px; POSITION: absolute; TOP: 24px" runat="server">Texto:</asp:Label> <asp:Label id="Label3" style="Z-INDEX: 106; LEFT: 24px; POSITION: absolute; TOP: 80px" runat="server">ExpReg:</asp:Label> </form> </body> </HTML>

Arquivo Listagem11_02.aspx.cs System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls;

using using using using using using using using using using

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 149

T u t o r i a l d e A S P. N E T

using System.Text.RegularExpressions; namespace Licao11 { public class Listagem11_02 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.TextBox TextBox2; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Label Label2; protected System.Web.UI.WebControls.Label Label3; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { Label1.Text = ""; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.Button1.Click += System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { Regex reg = new Regex(TextBox2.Text); if (reg.IsMatch(TextBox1.Text)) Label1.Text = "A expresso regular combina"; else Label1.Text = "A expresso regular no combina"; } }

new

Logging Alm disso, os sistemas de segurana (proteo de senha, criptografia, controle de acesso, etc.) no so 100% confiveis. Portanto, necessrio utilizar de mtodos como auditorias e logging. Auditoria o processo de monitorar certas atividades e fazer o logging dos resultados de monitorao em um log de eventos. Logging o processo de escrever informaes sobre as atividades em um local conhecido para posterior visualizao. Para aplicaes ASP.NET, o logging realizado pelo IIS. O logging realizado a nvel de site. O logging pode ser ativado pelo dilogo de propriedades do site, no administrador do IIS.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 150

T u t o r i a l d e A S P. N E T

Controle de acesso A maior parte de gerenciamento de segurana para os desenvolvedores recai em controle de acesso. Controle de acesso o processo de definir quem pode acessar os recursos da aplicao. Isto inclui autenticao e autorizao.

Autenticao o processo de validar se usurio realmente diz quem ser. Autorizao o processo de determinar se o usurio tem permisso para executar a ao requisitada.

H vrios mtodos de autenticao e autorizao em ASP.NET. preciso lembrar que os melhores sistemas de controle de acesso a aplicao so inteis se o malfeitor tem acesso fsico ao servidor ou pode danific-lo de alguma forma. A autenticao e autorizao em ASP.NET se d em dois nveis: o nvel de sistema operacional/IIS e o nvel de ASP.NET. A autenticao/autorizao feita nesta seqencia: 1. Uma requisio por um recurso ASP.NET (um Web Form, por exemplo) chega ao IIS 2. Se algum dos mtodos de autenticao do IIS est habilitado, o IIS realiza a autenticao e adiciona a informao de autenticao mensagem de requisio 3. O IIS passa a mensagem de requisio ao framework ASP.NET. O IIS no participa mais da requisio a partir deste ponto 4. Se a autenticao via Windows est habilitada, a autorizao realizada de acordo com as informaes de autenticao feita pelo IIS. Se a autorizao procede, a requisio processada 5. Se a autenticao via Forms est habilitada, o ASP.NET verifica o cookie de autenticao Forms. Se o cookie no existe, o usurio redirecionado pgina de login da aplicao. Uma vez que o usurio realiza o logon, e a autorizao procede, a requisio processada. 6. Se a autenticao via Passport est habilitada, o ASP.NET verifica o cookie de autenticao Passport. Se o cookie no existe, o usurio redirecionado pgina de login do Passport. Uma vez que o usurio entra com seu Passport, e a autorizao procede, a requisio processada. Autenticao Existem, portanto, trs mtodos de autenticao em ASP.NET: via Windows, via Forms e via Passport. O mtodo escolhido depende de vrios fatores, como o tipo de clientes da aplicao, o controle sobre o navegador dos clientes, a quantidade de pblico esperada, etc. Obviamente, possvel no utilizar autenticao alguma para web sites simples. O tipo de autenticao feita no arquivo Web.config, no elemento authentication. Autenticao baseada em Windows

Neste caso, o ASP.NET deixa que o IIS autentique o usurio. H trs sub tipos desta autenticao:

Autenticao bsica: compatvel com a maioria dos navegadores, mas a senha enviada em texto plano via internet Autenticao digest: introduzida com HTTP 1.1, e pode no ser suportada por todos os navegadores. preciso um controlador de domnio Windows 2000 na rede. A senha enviada como hash, e o IIS confere com a senha cadastrada no controlador de domnio.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 151

T u t o r i a l d e A S P. N E T

Autenticao integrada com Windows (NTLM): Disponvel apenas com Internet Explorer. o mais seguro porque nunca envia login e senha via rede. O protocolo usado no HTTP, portanto pode ser complexo implement-lo para clientes provenientes da Internet. Tambm requer que o usurio tenha uma conta Windows cadastrada ou no servidor Web ou no controlador de domnio.

Para utilizar esta autenticao, voc deve configurar o elemento authorization com o atributo mode para Windows. Depois, voc configura a aplicao, no administrador IIS, na aba Segurana de diretrio. Mais de um mtodo pode ser selecionado para autenticao. Neste caso, a autenticao integrada ao Windows e a autenticao digest sempre ter precedncia sobre autenticao bsica. E voc deve desligar a autenticao annima. Autenticao baseada em Passport

Passport um servio de autenticao centralizado da Microsoft. Com a autenticao via Passport, possvel autenticar o usurio com seu Passport. Para fazer isso, preciso instalar o Passport SDK, provido pela Microsoft. O servio de autenticao Passport pago. Autenticao baseada em Forms

A autenticao baseada em Forms permite aos desenvolvedores criar sua prpria metodologia de autenticao. Tudo o que necessrio fazer criar uma pgina de login de configurar a aplicao onde encontr-la (no arquivo Web.config). Na pgina de login feita a verificao de login e senha fornecido (verificando banco de dados, arquivo XML, domnio Windows, etc.). Uma vez que a autenticao feita, possvel utilizar os mtodos da classe FormsAuthentication para remover ou atualizar o cookie de autenticao e redirecionar o usurio pgina que ele requisitou. Se um usurio tentar acessar um recurso sem estar autenticado, ou seja, sem ter o cookie de autenticao, ele automaticamente redirecionado para a pgina de login. Com autenticao baseada em Forms, a senha e usurio enviada em texto plano. Para proteger os dados transmitidos, preciso utilizar SSL. A configurao no arquivo Web.config mais ou menos essa: <authentication mode="Forms"> <forms name=".COOKIEDEMO" loginUrl="login.aspx" protection="All" timeout="30" path="/"/> </authentication> A propriedades indicadas no elemento forms so as seguintes:

name: Este o nome do cookie que ser gravado no cliente. Esse cookie guarda o ticket de autenticao do usurio loginUrl: Esta o URL ao qual todos os usurios no autenticados sero redirecionados. Na maioria dos casos, essa uma pgina de login, onde o cliente vai dar as suas credenciais para autenticao.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 152

T u t o r i a l d e A S P. N E T

protection: Mtodo utilizado para proteo dos dados do cookie de autenticao. Os valores possveis so: All: Faz validao e encriptao dos dados. O algoritmo DES triplo utilizado para fazer a encriptao. o mtodo padro para Forms, e o mais indicado. None: Usados para sites com requisitos fracos em autenticao. o mais eficiente em performance, mas deve ser utilizado com precauo. Encryption: realizada a encriptao dos dados do cookie com DES ou DES triplo, mas no faz validao dos dados. Validation: No utiliza encriptao no cookie, mas certifica-se de que os dados no foram alterados no trnsito. timeout: A quantidade de tempo, em minutos inteiros, em que o cookie vai expirar. O valor padro 30 minutos. O tempo atualizvel, ou seja, o cookie vai expirar depois de n minutos depois que o ltimo recurso foi requisitado. path: o caminho utilizado no cookie. O padro /, para evitar problemas com duplicao de cookies.

importante o elemento deny, filho do elemento authorization, configurado com ? Isso vai negar todas as requisies feitas por usurios annimos, redirecionando-os para a loginPage. <authorization> <deny users="?" /> </authorization> Importante: normalmente as pginas que necessitam de autorizao ficam em uma pasta separada dentro da aplicao. Isso porque normalmente se faz a pgina de login com acesso annimo, e a parte segura com as configuraes de segurana vistas acima. Essas configuraes so feitas no arquivo Web.config, e apenas uma configurao pode estar presente por arquivo. Pode existir um arquivo Web.config por pasta na aplicao. A pasta herda as configuraes da pasta pai, e utiliza as configuraes do arquivo Web.config presentes na prpria pasta, se existir. Portanto, para fazer um site com autenticao Forms, siga estes passos: 1. Crie uma pgina para autenticar seus usurios. Ela deve fazer qualquer processamento para ter certeza de que o usurio realmente quem diz que . Normalmente, a pgina pede nome de usurio e senha, verifica se esses valores esto presentes em um banco de dados. 2. Configure o mtodo de autenticao para, quando o usurio for autenticado, chamar o mtodo RedirectFromLoginPage(), da classe FormsAuthentication (System.Web.Security.FormsAuthentication). Ele far com que o usurio seja automaticamente redirecionado para a pgina que ele requisitou quando foi enviado automaticamente para a pgina de login. O mtodo de autenticao pode ser ago assim: private void Entrar_Click(object sender, System.EventArgs e) { if (txtUsuario.Text == txtSenha.Text) { FormsAuthentication.RedirectFromLoginPage(txtUsuario.Text, false); } }

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 153

T u t o r i a l d e A S P. N E T

Em alguns casos, voc vai querer manter uma parte do site disponvel para todos os usurios, e outra parte disponvel apenas para usurios autenticados. Ns fizemos isso em nosso exemplo. As pginas so Listagem11_03.aspx e Listagem11_04.aspx. Deixamos a raiz da aplicao disponvel para todos os usurios (para que pudessem acessar as pginas Listagem11_01.aspx e Listagem11_02.aspx). Por isso, fizemos configuraes especiais no arquivo web.config da raiz: <authentication mode="Forms"> <forms name=".COOKIEDEMO" loginUrl="Listagem11_03.aspx" protection="All" timeout="30" path="/" /> </authentication> <authorization> <allow users="*" /> </authorization> Isso configura a aplicao para trabalhar com o modelo de autenticao Forms, mas autoriza todos a acessarem as pginas da aplicao. Na pasta seguro queremos que apenas usurios autenticados possam acess-la. Portanto, escrevemos o seguinte arquivo web.config e colocamos dentro da pasta seguro: <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </configuration> O elemento deny com propriedade users=? vai impedir que usurios no autenticados acessem a aplicao nesta pasta. Na pasta seguro, colocamos o arquivo Listagem11_04.aspx com uma mensagem de saudao, que s ser acessada se o usurio passar pela validao. A validao de usurio no nosso exemplo bastante simples, basta escrever uma senha igual ao nome de usurio fornecido. Na pgina Listagem11_04.aspx h ainda um mtodo para deslogar o usurio: private void Button1_Click(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("Listagem11_03.aspx"); } FormsAuthentication.SignOut() remove o cookie de autenticao do usurio, e Response.Redirect() faz o usurio ser redirecionado para a pgina de login do sistema. Autorizao Para autorizao, o ASP.NET possui dois mtodos embutidos:

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 154

T u t o r i a l d e A S P. N E T

Autorizao utilizando ACLs do NTFS

A autorizao ACL til quando se utiliza autenticao Windows. Com este meio de autorizao, possvel setar permisses nas pastas e arquivos da aplicao para acesso dos usurios e grupos. A principal vantagem de utilizar autorizao ACL que no requer a codificao da lgica de autorizao no programa ASP.NET. O usurio tem acesso a um Web Form se seu o usurio tem permisso de acesso aos dados da pasta onde o Web Form est. Este mtodo ideal para Intranets, porque deixa o desenvolvimento mais rpido, e transfere o gerenciamento das permisses para o administrador de sistemas da Intranet.

Autorizao baseada em URL

Da mesma forma que a autorizao por ACLs, a autorizao baseada em URL requer contas de usurio Windows. Com a autorizao baseada em URL, as informaes de autorizao so escritas no arquivo Web.config com a tag <authorization>. Desta forma, possvel definir diferentes instrues de autorizao para diversos pontos do sistema. Isso garante tambm a vantagem de evitar escrever cdigo de autorizao, e restringe o gerenciamento de permisses aplicao. A diferena para o mtodo anterior que o gerente da aplicao que precisa especificar quem vai acessar que pasta. O mtodo de autorizao baseada em URL interessante para fazer algumas configuraes de autorizao genricas. Voc utiliza o elemento authorization no arquivo web.config. Voc pode liberar ou negar o acesso para determinados usurios para o diretrio onde est o arquivo web.config. O elemento authorization possui dois elementos de permisso, chamados deny e allow. O elemento deny nega a autorizao para um determinado usurio, enquanto que o elemento allow d a autorizao. Os elementos deny e allow so sempre na forma: <deny/allow [propriedade users] [propriedade verbs] [propriedade roles] /> As propriedades dos elementos esto definidas na tabela abaixo: Propriedade roles users verbs Significado Grupo utilizado pelo usurio autenticado. Normalmente utiliza os grupos do Windows, se a autenticao for feita por Windows. O nome do usurio para autorizar. O mtodo utilizado para acessar a pgina. Pode ter os valores HEAD, GET ou POST.

O exemplo abaixo permite acesso ao diretrio para o usurio Kim e todo o grupo Admins, e nega a autorizao para o usurio John e todos os usurio no autenticados: <authorization> <allow users="Kim"/> <allow roles="Admins"/> <deny users="John"/> <deny users="?"/> </authorization> O smbolo ? foi utilizado para representar usurios no autenticados. Voc pode utilizar os seguintes smbolos em users:

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 155

T u t o r i a l d e A S P. N E T

Smbolo ? *

Significado Se refere a todos os usurios no autenticados Se refere a todos os usurios

Para permitir acesso a John e negar acesso a todos os demais, utilize o seguinte: <authorization> <allow users="John"/> <deny users="*"/> </authorization> O ltimo exemplo deixa todos os usurios usarem GET, mas apenas Kim pode utilizar POST: <authorization> <allow verb="GET" users="*"/> <allow verb="POST" users="Kim"/> <deny verb="POST" users="*"/> </authorization> As seguintes regras so aplicadas a autorizao:

As regras contidas em um arquivo de configurao em diretrios de nvel mais baixo tomam precedncia em cima das regras definidas em diretrios de nveis mais altos. O framework faz a unio de todos os web.configs presentes no caminho da requisio para montar uma lista de permisses. Quando uma lista de permisso montada, o framework procura a partir do incio da lista por uma combinao (de role, verb ou user). Quando uma combinao encontrada, ela executada. Se a combinao for um allow, o sistema d a autorizao. Se for um elemento deny, ela nega a autorizao, retornando um erro 401. Lembre-se que por padro, o elemento authorization da raiz de toda Web Application possui um elemento <allow users=* />, dando permisso para todos os usurios. Portanto, se nenhuma combinao encontrada, por padro ela permitida. Modifique o elemento allow para deny para evitar esse comportamento.

Sumrio Voc aprendeu um pouco sobre o modelo de segurana de aplicaes ASP.NET. Voc aprendeu como pode armazenar seguramente uma senha de usurio, e viu que a conexo com o navegador pode ser encriptada para evitar hacking. Voc aprendeu como deve tratar os dados de cliente, e como pode utilizar expresses regulares em .NET para validar entrada. Por fim, voc aprendeu que h dois nveis de proteo em ASP.NET: aquele definido no servidor Web (IIS), e o definido na aplicao em si. Voc pode relegar a autenticao do usurio para o servidor Web, para o servidor Passport ou tratar voc mesmo, atravs do elegante modelo de autenticao por Forms. Para autorizao, voc pode negar usurios e mtodos de acessarem pastas determinadas da sua aplicao.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 156

T u t o r i a l d e A S P. N E T

Lio 12: Utilizao de cache

Esta lio fala das possibilidades de caching para pginas ASP.NET. Especificamente, os objetivos da lio buscam:

Ensinar o conceito de cache Mostrar como possvel fazer cache de Web Forms ASP.NET

Introduo Um dos fatores mais importantes para desenvolver aplicaes web escalveis e de alta performance a habilidade de armazenar itens em memria, na primeira vez que so requisitados. Voc pode armazenar esses itens no servidor Web, ou no navegador. Assim, isso evitar a recriao de informao que j foi satisfeita em uma requisio anterior, particularmente informaes que demandam tempo de processador ou outros recursos para serem criadas. Conhecido como caching, essa tcnica permite que voc utilize alguns processos para armazenar a sada da pgina ou os dados da aplicao entre requisies HTTP e reuslas. Assim, o servidor no ter que recriar a informao, salvando tempo e recursos. ASP.NET prov um tipo de caching conhecido como cache de sada, que permite que voc armazene a resposta de uma pgina ou de um controle em qualquer equipamente HTTP 1.1 capaz de cache (como qualquer navegador moderno). Em requisies subseqentes, a pgina ou o controle no executado; a sada que est no cache usada para satisfazer a requisio.

Fazendo cache de pginas inteiras ASP.NET permite que voc faa cache do resultado inteiro do processamento de uma pgina em mecanismos que suportem HTTP 1.1, incluindo navegadores, servidores proxy, e no prprio servidor Web onde a pgina reside. Este um mtodo poderoso que aumenta a performance de sua aplicao. Este mtodo chamado de cache de sada. Ele permite que requisies subsequentes a uma mesma pgina utilizem o contedo cacheado na primeira requisio, e assim o servidor poupa o tempo e recursos utilizados para cri-la. Quando voc utiliza essa tcnica nas pginas mais frequentemente acessadas de sua aplicao, voc aumenta o throughput (medido em requisies atendidas por segundo) substancialmente. Funciona assim: voc configura um cabealho HTTP de resposta chamado Expires, indicando em que data e hora a pgina deveria ser considerada expirada. Ento, essa pgina cacheada em entidades de cache HTTP em seu caminho do servidor at o cliente (o navegador, servidores proxy e servidor web). Quando o navegador receber o comando para buscar a pgina, ele avalia o dado de Expires para aquela pgina. Se a hora atual menor que a hora indicada em Expires, o navegador no faz a requisio, e utiliza a cpia do cache. A qualquer momento, no entanto, o usurio pode buscar a pgina mais atual no servidor, clicando no boto Atualizar do navegador.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 157

T u t o r i a l d e A S P. N E T

ASP.NET inclui um conjunto de APIs que controlam as polticas de cache e expirao de pgina. Estes mtodos esto disponveis para uso atravs do objeto Response.Cache. Por exemplo, o seguinte cdigo, quando includo no cdigo executvel de uma pgina, configura o prazo de expirao da pgina para 60 segundos, usando o mtodo SetExpires() de Response.Cache. Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); Assim que voc chama esse mtodo, a requisio GET inicial que voc faz para a pgina pe o contedo dela no cache de sada pela quantidade de tempo que voc indicou. O cache de sada vai satisfazer quaisquer requisio GET, POST ou HEAD que for feita para ela, durante o tempo indicado. Cacheabilidade Voc pode definir onde guardar o cache de sada (servidor ou cliente) . Dependendo das necessidades de sua aplicao, voc vai querer configurar o cache de maneira apropriada. ASP.NET permite que voc configure este recurso atravs do mtodo SetCacheability() de Response.Cache. SetCacheability() recebe um valor da enumerao HttpCacheability Existem 6 valores diferentes para esta enumerao: Valor NoCache Significado Seta o cabealho HTTP Cache-Control para no-cache. Essa diretiva se aplica a requisio inteira, e faz os caches compartilhados (ou seja, servidores proxy) revalidarem toda a pgina com o servidor web de origem antes de satisfazer a requisio. O valor padro. Configura Cache-Control para private. Isso especifica que a resposta cachevel apenas no cliente (navegadores) e no em caches compartilhados (servidores proxy). Configura Cache-Control para public, especificando que a resposta cachevel tanto no cliente quanto em caches compartilhados. Especifica que o resultado da pgina cachevel apenas no servidor. Os clientes recebem Cache-Control como no-cache, mas a pgina cacheada no servidor de origem. O contedo cacheado no servidor, e explicitamente proibido de ser cacheado em qualquer outro ponto. Indica que o contedo cacheado no servidor e no cliente, e em nenhum outro lugar. Servidores proxy no so permitidos de fazer cache do contedo.

Private

Public

Server

ServerAndNoCache ServerAndPrivate

O exemplo da Lio 12 mostra o cache agindo na prtica. So definidas duas pginas ASP.NET. As duas preenchem a data atual do servidor em um campo da pgina, e cada uma possui um link para a outra.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 158

T u t o r i a l d e A S P. N E T

A diferena entre Listagem12_01.aspx e Listagem12_02.aspx que a segunda possui, no mtodo de Load, uma chamada para SetExpires(), dessa forma: Response.Cache.SetExpires(DateTime.Now.AddSeconds(15)); Portanto, se voc ficar navegando entre essas pginas, observar que a pgina Listagem12_02.aspx no atualizada. Se voc tiver a ferramenta Fiddler instalada, observar ainda que a pgina tampouco requisitada para o servidor. Aps 15 segundos, no entanto, a pgina expira no cliente, e requisitada novamente no servidor.

Sumrio Esta lio mostrou o bsico sobre caching em ASP.NET. Voc sabe como funciona o mecanismo de caching em HTTP, e sabe como configurar prazos de expirao para Web Forms. Outros mecanismos de caching mais avanados existem em ASP.NET, e uma pesquisa sobre ASP.NET Caching Features na documentao .NET 1.1 podero indicar mais caminhos.

Cuiab, 23 de Agosto de 2005, 12:17

Documento: TIPX-1

Pgina 159

Das könnte Ihnen auch gefallen