ASP.NET 3.5 em VB.NET e C#

Tamanho: px
Começar a partir da página:

Download "ASP.NET 3.5 em VB.NET e C#"

Transcrição

1

2 Copyright 2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e outros direitos de propriedade intelectual; Este documento é de distribuição gratuita para uso pessoal. É vedada qualquer outra forma de utilização, divulgação, publicação, distribuição etc. sem autorização do autor.

3 Sobre o Autor Fernando Amaral trabalha a mais de 10 anos com o desenvolvimento de software. É certificado Microsoft MCP, MCAD, MCSD, MCDBA e MCT, Comptia CDIA+, Project Managment Institute PMP. É Pós Graduado em Gestão de Sistemas de Informação pela Uniderp e em Melhoria de Processo de Software pela UFLA. Além disso tudo é Ateu. Atualmente reside em Campo Grande MS. Sobre Eu mantenho um site com alguns artigos e tutoriais de tecnologia no endereço Através do site existe um formulário onde posso ser contatado.

4 Sobre Existe muito conteúdo para quem quer aprender ASP.NET. Existem centenas de bons livros. Porém este curso em formato digital traz algumas características que talvez você não encontre em nenhum lugar: É completo no sentido que abrange todos os principais temas relacionados ao ASP.NET 3.5; Segue uma seqüência lógica. Você não precisará ficar garimpando informações em lugares diferentes; É em português. Porque não um Livro? Este curso foi criado dentro de minhas possibilidades, de maneira que não precisei assumir nenhum compromisso.

5 1. Introdução ao ASP.NET Visual Studio 2008: O ambiente e as linguagens Web Forms Controle Master Page Themes e Skins Navigation WebParts LINQ MemberShip e Roles Manutenção de Estado ASP.NET AJAX Criando e Consumindo WebServices Criando uma página de erros personalizada Eventos da aplicação Distribuindo sua Aplicação Relatórios com Crystal Report

6 1. Introdução ao ASP.NET Desenvolver aplicações nunca foi tão fácil. Ambientes RAD cada vez mais modernos e amigáveis tem tornado o trabalho dos arquitetos de software cada vez mais simples. Com o versão 3.5 do ASP.NET, conseguiu-se atingir níveis de produtividade nunca antes imaginados. Este curso tem por objetivo introduzir o desenvolvedor no mundo do desenvolvimento de aplicações Web utilizando o ASP.NET 3.5. Não é um curso introdutório de lógica de programação. Os exemplos ao longo do curso serão todos demonstrados em VB.NET e C#. Blocos de código serão precedidos pelo ícone da linguagem utilizada: para código em VB para código em C# O que é o Microsoft.NET FrameWork? Tradicionalmente o desenvolvedor escreve Software para um sistema Operacional ou dispositivo especifico. Por exemplo, ao criar um programa no Delphi 7 ou no Visual Basic 6, ele esta criado um Software para rodar em Sistemas Operacionais Windows sobre a plataforma Intel. Ao desenvolver um software para o.net, o desenvolvedor ao invés disto esta fazendo um software para rodar em qualquer dispositivo ou plataforma que tenha o.net Framework instalado. Existem dezenas de linguagem que podem ser usadas para criar um programa.net, a Microsoft desenvolveu o VB.NET, uma versão Orientada a Objetos do clássico VB e o C#, que herdou sua sintaxe do C++. Outras empresas desenvolveram outras: COBOL, Delphi, Fortran etc. só para citar algumas. Você mesmo pode criar sua própria linguagem. A escolha entre uma linguagem ou outra é apenas uma questão de sintaxe. 6

7 Isto é possível porque um programa escrito para.net é compilado em uma linguagem intermediaria chamada MSIL (Microsoft Intermediate Language). Não importa qual linguagem em que você codificou, o resultado, em termos de performance, qualidade, tamanho dos binários etc. será o mesmo. O arquivo compilado em MSIL normalmente resulta um uma DLL, denominada assembly. Quando o programa for executado pela primeira vez, entre em cena o JIT (Just In Time Compiler), que vai fazer uma nova compilação do programa, desta vez de acordo com as especificações do sistema operacional e do dispositivo em que o.net Framework se encontra. Desenvolver um sistema para o plataforma.net, traz mais alugmas vantagens além de das ficaram óbvias nesta introdução. A mais importante é que o seu programa vai rodar em um ambiente protegido e especifico, sem ter que se preocupar com as especificações ou problemas do sistema operacinal. Toda a interação com este, como por exemplo, o gerencimento de memória, é feita pelo.net. ASP.NET 1.X Nos ultimos anos surgiram fantásticas IDEs para desenvolvimento de aplicações Windows. Algumas permitiam que você abrisse uma tabela qualquer, permitindo ainda a sua edição, sem sequer escrever uma linha de código. Outras através de assistentes automatizavam tarefas poupando tempo e muitas dores de cabeça. Surgiram ainda diversas ferramentas que prometiam a criação de aplicativos inteiros sem a necessidade de escrever uma linha de código qualquer. Porem não podemos dizer o mesmo para as aplicações Web. Além algumas frustadas tentativas, não existiu nenhum ambiente de alta produtividade como existiam para aplicações convencionais. As linguagens, principalmente o ASP classico, semelhante ao Visual Basic, era limitada é sem os recusos de linguagens OO. Ao planejar o.net, a Microsoft vislumbrou um ambiente para aplicações Web onde se pudesse desenvolver aplicações no mesmo ambiente e com as mesmas facilidades de aplicações convencionais, utilizando a mesma linguagem. 7

8 Promessa cumprida: O.NET 1.x junto com o Visual Studio 2002 / 2003 proporcionou um ambiente para aplicações WEB, totalmente integrado, com as facilidades só antes vistas em ambientes de aplicações convencionais: WYSIWYG, Drag and Drop, Intellisense, recursos de depuração avançados etc. Já era possivel exibir uma tabela numa aplicação WEB com duas linhas de código, e sem escrever uma Tag HTML sequer! O ASP.NET foi o primeiro ambiente que permitiu que se desenvolvessem aplicações convencionais ou para Web em uma mesma IDE, utilizando a mesma linguagem. ASP.NET 2.0 Não há duvidas que a plataforma.net 1.x e o ASP.NET 1.x mudaram a maneira como as aplições Web são desenvolvidas. Porém a equipe de desenvolvimento da plataforma percebeu que muito ainda poderia ser feito, principalmente no que diz respeito a produtividade, Normalmente você não precisa ser um profundo conhecedor de HTML para desenvover uma aplicação Web no VS Porém um conhecimento básico é recomandado: sempre há necessidade de algum ajuste manual. e esse foi o objetivo principal da equipe de durante seu desenvolvimento. Como resultado, houve uma melhora de produtividade em até 70%! Vejamos algumas das melhorias do ASP.NET 2.0 em relação ao seu antecessor: Mais de 50 novos Server Controls Novas ferramentas adiminstrativas Nova IDE do Visual Studio 2005 Site Navigation: Controles que facilitam a navegação em Web Sites Master Pages: Agora é possível utilizar herança visual em aplicações Web, o que na versão 1.x só era possivel com aplicações Windows Forms. Themes: Tornam mais facil o gerenciamento do visual de sua aplicação Acesso a Dados: O ADO.NET embora extramente eficiente, era demasiadamente complexo. O Acesso a dados foi reformulado e simplificado. Snippets: Partes de códigos especificas que podem ser armazenadas para utilização futura. 8

9 ASP.NET 3.5 As mudanças do ASP.NET 2.0 e 3.5 foram poucas, porém significativas. Na verdade o core engine das duas versões continua o mesmo. Para projetos em ASP.NET 3.5 o ASP.NET AJAX Extensions passou a estar integrado a IDE do Visual Studio, não é mais necessário baixar e instalar separadamente. É encontrado no assemblie System.Web.Extensions.dll. Outra grande novidade, já há bastante esperada é o LINQ. A Gap que existe entre dados relacionais e objetos já não é um assunto novo, já recebendo inclusive artigos meus. Já postei também alguns artigos técnicos sobre LLBLGen e NHibernate. Agora o.net avança nesse sentido com o LINQ. O LINQ não é nenhuma novidade, porém agora é integrado ao Visual Studio. A idéia do LINQ também não é nova, com esta tecnologia você pode operar o banco de dados em uma linguagem nativa, como se tivesse gerando código VB.NET ou C#. É encontrado nos assemblies System.Core.dll, System.Data.Linq.dll, System.Xml.Linq.dll e System.Data.DataSetExtensions.dll. Também há controles novos. Além dos controles Ajax Extensions que na versão anterior deviam ser instalados separadamente, existem mais três novos controles: ListView, DataPager e LinqDataSource. O Listview é um controle de exibição de dados tabulares, semelhante ao Datagrid e GridView, porém com novas funcionalidades e maior controle sobre o resultado produzido. DataPager é um controle que prove paginação de dados ao Listview. LinqDataSource é mais um controle de acesso a dados, como ObjectDataSource e o SQLDataSource, porém utilizando o modelo LINQ descrito em sessão anterior. Estrutura de uma aplicação ASP.NET 2.0 e 3.5 Nesta sessão apresento algumas considerações sobre o estrutura de aplicações ASP.NET 2.0 e 3.5, que como dito em seção anterior, permaneceram inalterados. Você já percebeu que muita coisa mudou entre o ASP.NET 1.x e seu predecessor. Uma das grandes propagandas no lançamento da primeira versão do ASP.NET era o modelo code-behind, onde apresentação e código de servidor ficam armazenados em arquivos 9

10 fisicamente separados, tornando o código mais limpo e intuitivo tanto para o designer quanto para o programador. Trabalhar com tudo em um único arquivo até era possível, porém desvantajoso. No ASP.NET 3.5, embora o padrão seja um arquivo único, pode-se facilmente optar em trabalhar com arquivos separados, basta desmarcar a opção place code in separated file na caixa de dialogo de criação de um novo Web Form: Este novo modelo é denominado code-inline. Se você optar por trabalhar com este modelo, seu código de servidor vai estar separado entre tags Script. O grande problema na versão 1.x era que trabalhando com um único arquivo perdíamos alguns recursos poderosos de programação, como o Intellisense. Na versão 2.0 e 3.5 não há qualquer problema: tudo que funciona no modelo code-behind funciona também no code-inline. Post-Back entre páginas Até o.net 1.x um controle só poderia causar um post back para a própria página. Agora esta limitação acabou, através da propriedade PostBackUrl, presente no botão de comando e similares, que permite que seja executa um postback para outra pagina Asp. Este novo recurso é conhecido como Cross-Page Posting. 10

11 Agora é possível inclusive ler valores de controles ou propriedades de páginas que deram origem ao postback. Esta fantástica inovação surgida no ASP.NET 2.0 permite tornar o código mais limpo, mas otimizado, além de reduzir a necessidade de utilização de variáveis de sessão, querystring e outros. Pastas A partir da versão 2.0 o ASP.NET uma aplicação Web deixou de ser orientada a projeto e passou a ser orientada a arquivos. Em conseqüência foram definidas uma série de pastas com funções especificas, vamos ver as principais: App_Code: Para armazenamento de classes App_data: Armazena fontes de dados App_Themes: Armazena um tema. Estudaremos temas mais adiante. App_LocalResources: Armazena arquivos de recursos Arquivos Nesta sessão vamos ver os principais tipos de arquivos que uma aplicação ASP.NET pode conter: Web.config: è um arquivo contendo as configurações da aplicação, formatado com XML..aspx: arquivo contendo a apresentação de uma página..vb ou.cs: arquivo com código de servidor relacionado a uma página Global.aspx: Arquivo contendo os eventos globais da aplicação..master: Arquivo contendo uma MasterPage..ascx: Arquivo contendo um WebUserControl.css: Arquivo css.resx: Arquivo de recursos.sitemap: Arquivo contendo um mapa do site.skin: Arquivo contendo um skin 11

12 2. Visual Studio 2008: O ambiente e as linguagens Nesta seção vamos ver os principais compontentes da IDE do VS A esquerda, por padrão oculta, existe a Barra de Ferramentas, onde ficam agrupados por categoria os compontes padrão do VS ou de terceiros instalados no ambiente. Para instalar um novo componente, basta clicar com o botão direito sobre a barra e selecionar Choose Itens. Você pode também personalizar a sua barra de ferramentas da maneira que achar melhor. A direita temos o Solution Explorer, que permite uma navegação rápida entre os arquivos de um projeto ou solução. Abaixo, a janela de propriedades, permite configurar as propriedades de um controle ou de um formulário, bem como acessar eventos. Entre as principais novidades do ambiente temos as notificações de status da linha através de cores: Uma nova linha de código ou código alterado é marcado como amarelo. Se a linha já foi salva sua cor muda para verde. 12

13 Outra novidade são os Snippets: pedaços de código pré fabricados para executar uma tarefa especifica. Tudo bem que isso não é uma grande novidade e já foi utilizada em outras IDEs por aí a fora, mas com certeza o recurso esta melhor do que nunca e poderá lhe ajudar a poupar bastante trabalho. Para inserir um Snippet basta chama-lo no menu rápido sobre a área de código. Obviamente que você também poderá criar seus proprios snippets. SINTAXE: VISUAL BASIC.NET e C# Vamos introduzir os principais aspectos d a sintaxe de programação do VB.NET e do C#. Este não será um estudo completo ou abrangente, para tal procure bibliografia específica. Lembre-se sempre que o C# diferencia entre caracteres maisculos e minusculos, o VB.NET não. Comentários Você já deve ter encontrado discussões ardentes na internet sobre C# ser melhor que VB.NET e vice-versa. A verdade que conhecendo os fundamentos da plataforma sabemos que o resultado é exatamente igual. No C# comentário de linha são feitos com duas barras. Comentários em bloco são aberto com \* e fechados com *\. No VB.NET Comentários são inseridos com aspas simples no inicio da linha. O VB.NET não permite o comentário de blocos de código, a solução é comentar linha a linha. Porém o Visual Studio possui em sua barra de ferramentas padrão o comando Comment out the selected lines que comenta um bloco de código selecionado e Uncomment the selected lines que remove os comentários, a utilização é simples e intuitiva, e funcina em ambas as linguagens este é um comentário válido Dim i as Integer esta também é um comentário válido //este é um comentário válido int x = 3; /* este também é um comentário válido */ 13

14 Você ainda pode criar comentários no VB.NET utilizando Rem. No Visual Studio 2008 também é possível documentas seu código sem a necessidade de instalar qualquer plug-in, basta adcionar três aspas (vb.net) ou tres barras (C#) antes do procedimento. O VS automaticamente preenche o esqueleto do documento. Observe o exemplo abaixo: ''' <summary> ''' Função para somar dois números ''' </summary> ''' <param name="x">primeiro número a somar</param> ''' <param name="y">segundo número a somar</param> ''' <returns>resultado da soma</returns> ''' <remarks>by Fulano</remarks> Public Function Somar(ByVal x As Integer, ByVal y As Integer) _ As Integer Dim z As Integer z = x + y Return z End Function /// <summary> /// Função para somar dois números /// </summary> /// <param name="x">primeiro número a somar</param> /// <param name="y">segundo número a somar</param> /// <returns>resultado da soma</returns> int Somar(int x, int y) { int z; z = x + y; return z; } O VS ainda pode gerar um diagrama de sua classe, basta clicar com o botão direito sobre o arquivo, e selecionar View Class Diagram Tipos de Dados Sendo o.net um framework, não existem tipos de dados desta ou daquela linguagem. Os tipos são todos do.net. Obviamente que existem diferenças de sintaxe na declaração e manipulação destas variaveis. Abaixo segue uma relação dos principais tipos de dados, para uma relação completa consulte a documentação do VS 2008: 14

15 Boolean Verdadeiro ou falso Char - caractere unicode de 16 bit String - String Byte inteiro de 8 bit, sem sinal UInt16 - inteiro de 16 bit, sem sinal UInt32 - inteiro de 32 bit, sem sinal UInt64 - inteiro de 64 bit, sem sinal Int16 inteiro de 16 bit, com sinal Int32 - inteiro de 32 bit, com sinal Int64 - inteiro de 64 bit, com sinal SByte - - inteiro de 8 bit, com sinal DateTime data e hora Decimal número decimal Double número de ponto flutuante com 64 bit Single - número de ponto flutuante com 32 bit Um valor nulo em VB.NET é representado por NOTHING, em C# por null. O tipo Int32 pode ser representado no VB.NET por Integer e int no C#. Operadores VB.NET C# And & Or XOr ^ Not! Is Nothing == null <>!= & + \ / \= /= Mod % = == 15

16 Variaveis e Constantes No VB.NET para declarar uma variável usamos a palavra DIM, seguido pelo nome da variável e tipo: Dim i as Integer A sintaxe do C# é semelhante ao do C++: int z; Podemos ainda declara diversas variaveis de um mesmo tipo numa unica declaração: Dim i,j,k as Integer int x, y, z; Ou ainda variaveis de diferentes tipos: Dim i,m as Integer, j,k as Single int i, m; Double j,k; Obviamente i e m serão do tipo inteiro, e j e K do tipo single. É possível ainda incializar a variável na sua declaração: Dim i as Integer = 1 int z = 1; Para declarar uma constante utilizamos a declaração Const: Const x as integer = 1 16

17 const int x = 1; Enumeradores Para declarar um enumerador usamos a declaração Enum Public Enum Semana Domingo Segunda Terça Quarta Quinta Sexta Sabado End Enum enum Semana { Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sabado }; Você opcionalmente pode inicializar cada menbro, se você não o fizer, o primeiro menbro será inicializado com zero e assim sucessimvamente. Enum Semana Domingo = 1 Segunda = 2 Terça = 3 Quarta = 4 Quinta = 5 Sexta = 6 Sabado = 7 End Enum enum Semana { Domingo = 1, Segunda =2, Terça =3, Quarta =4, Quinta =5, Sexta =6, Sabado =7 }; Coleções Poderíamos dedicar um longo capítulo ao estudo de coleção, sendo nosso objetivo fazer uma introdução a parte de sintaxe, veremos apenas arrays: Dim MeuArray(1) As String MeuArray(0) = "Um" MeuArray(1) = "Dois" 17

18 string[] MeuArray = new string[1]; arr[0] = "Um"; arr[1] = "Dois"; Ao contrário do legado VB, um array possui sempre índice iniciado em zero, portanto um array declarado com (1), terá duas posições. Estruturas de decisão O classico if não poderia faltar. A sintaxe é semelhante as suas linguagens legadas: Dim Nome As String = "ASP.NET" If Nome = "VB.NET" Then MessageBox.Show("Certo!") Else MessageBox.Show("Errado!") End If string Nome = "ASP.NET"; if (Nome == "C#") { MessageBox.Show("Certo!"); } else { MessageBox.Show("Errado!"); } Obviamente que a intrução else é opcional. Outra forma de controle de fluxo conhecido é o Select (VB.NET) ou Switch (C#): Dim Nome As String = "VB.NET" Select Case Nome Case "VB.NET" MessageBox.Show("Certo!") Case "C#" MessageBox.Show("Errado!") Case Else MessageBox.Show("?") End Select string Nome = "C#"; 18

19 switch (Nome){ case "VB.NET": MessageBox.Show("Certo!"); break; case "C#": MessageBox.Show("Errado!"); break; default: MessageBox.Show("?"); break; } Note que no C# devemos usar a palavra break para quebrar o fluxo Laços Vamos estudar três estruturas de laços: For, while e laços em coleções. O laço for tem a sintaxe semelhante em qualquer linguagem: Dim i As Integer For i = 1 To 10 MessageBox.Show(CStr(i)) Next i for (int i = 0; i < 10; i++) MessageBox.Show(Convert.ToString(i)); A sintaxe do C# nos permite facilmente fazer um loop regressivo, basta alterarmos o último argumento de i++ para i--, e obviamente mudarmos a condição: for (int i = 0; i < 10; i++) MessageBox.Show(Convert.ToString(i)); No VB.NET podemos conseguir o mesmo efeito utilizando a palavra chave Step: Dim i As Integer = 0 For i = 10 To 1 Step -1 MessageBox.Show(CStr(i)) Next i Existem laços While com teste de condição no inicio da sentença ou no final, neste último o laço executa sempre uma primeira vez, independente do resultado da avaliação. Vamos ver exemplos do primeiro caso: 19

20 Dim i As Integer = 0 Do While i < 5 MessageBox.Show(CStr(i)) i += 1 Loop int i = 0; while (i<5) { MessageBox.Show(Convert.ToString(i)); i += 1; } Finalmente, o que pode ser novidade para quem ainda não conhece a plataforma.net são os laços em coleções, que permitem percorrer um a um os membros de uma coleção qualquer. Dim numbers() = {4, 5, 6, 1, 2, 3, -2, -1, 0} Dim i As Integer For Each i In numbers MessageBox.Show(Convert.ToString(i)) Next int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; foreach (int i in numbers) { MessageBox.Show(Convert.ToString(i)); } Neste exemplo a titulo de simplicidade nossa coleção é um array, porém a estrutura funciona da mesma forma para qualquer tipo de coleção. Convertendo valores Para a conversão entre tipos de dados utilize a classe convert, seguida do método apropriado ao tipo que ser converter: Dim i As Integer, s As String s = Convert.ToString(i) int i; string s; s = Convert.ToString(i); 20

21 Procedimentos e funções Em VB.NET uma função começa com a palavra reservada function e termina com o tipo do dado de retorno. Já no C# inicia com o tipo do dado de retorno: Function Somar( x As Integer, y As Integer) _ As Integer Dim z As Integer z = x + y Return z End Function int Somar(int x, int y) { int z; z = x + y; return z; } O retorno é inidicado pela palavra-chave return ou pelo próprio nome da função. Um procedimento que não retorna valor em VB.NET inicia com a palavra chave Sub, e em C# com void: Sub Somar( x As Integer, y As Integer) _ As Integer Dim z As Integer z = x + y End Function void Somar(int x, int y) { int z; z = x + y; } A passagem de parametros por padrão ocorre por valor. Para indicar um parametro a ser passado por referencia, utilize ByRef no VB.BET e ref no C#. Visibilidade ou Scopo 21

22 A visibilidade de um procedimento, classe, inferface etc. é definada através das palavras reservadas a seguir: Public / public: acessível de qualquer lugar do projeto ou de instancias da classe Private / private: Acessível apenas dentro do mesmo contexto; Friend / internal: Acessivel apenas dentro do projeto; Protected / protected: Acessivel apenas dentro da classe ou de uma classe derivada; Protected Friend / Protected Internal: Acessivel apenas dentro da classe derivada ou do mesmo projeto; Ao declarar algo sem a visibilidade, por padrão será private. Tratamento de exceções O tratamento de exceções será surpresa apenas para quem esta começando agora a conhecer o VB.NET, que com o lançamento do linguagem ganhou uma forma estruturada de tratamento de erro semelhante as demais linguagens OO. È o adeus ao On error go to. O tratamento de erro é formando por uma estrutura Try...Catch..Finally. Entre o Try e o Catch deve ser colocado o código que você quer proteger de uma exceção. Entre Catch e Finnally o código a ser executado no caso de ocorrer uma exceção, e finalmente após Finnally algum código que você queira que obrigatóriamente seja executado, ocorrendo ou não uma exceção, geralmente usado para liberar algum recurso alocado. Vale lembrar que você pode usar apenas parte da funcionalidade do bloco, por exemplo, se você que apenas tratar uma exceção, pode contruir um bloco contendo apenas os comando try...catch. Por outro lado se você quer apenas garantir que um recurso seja liberado, como uma conexão com o banco de dados pro exemplo, você pode fazer uso apenas do bloco try...finally. Outra caracteristica importante é que as classes de exceção são executadas da mais especifica para a menos especifica, isto permite um tratamento de erros mais robusto e eficaz. Normalmente você deve terminar seu tratamento com a classe Exception, que é menos específica e que da origem a todas as demais. 22

23 Try My.Computer.FileSystem.CopyFile("Aspnet.pdf", "Aspnet.bkp") Catch ex As System.IO.IOException MessageBox.Show("Ocorreu um erro na cópia do arquivo") Catch ex2 As Exception MessageBox.Show("Ocorreu um Erro desconhecido") End Try try { string s = null; } catch (ArgumentNullException s) { MessageBox.Show("Ocorreu um erro na string"); } catch (Exception r) { MessageBox.Show("Ocorreu um Erro desconhecido"); } With O with, que não tem equivalente no C#, permite omitir o nome de um objeto quando o mesmo é utilizado em diversas linhas. With GridView1.Caption = "GridView".EditIndex = 0.Enabled = False End With Orientação a Objetos Vamos também apresentar alguns aspectos da sintaxe da criação de classes no VB.NET e no C#. Porém antes é preciso conhecer o conceito de NameSpaces. NameSpaces é uma estrutura simples, porém muito eficiente de organizar seu código. Por exemplo, uma suposta empresa GoodSoftware pode definir que todas suas classes terão como NameSpace raiz GoodSoftware. Abaixo deste existirão os NameSpaces ERP, CRM e Global. O NameSpace ERP abrigaria as classes de seus novo sistema ERP, o CRM idem, e o Global classes que para serem utilizadas em ambos os projetos. Dentro de cada um destes NameSpaces é possível criar n outros. Outra importante 23

24 vantagem do seu uso é redução de problemas com conflitos com nomes repetidos de classes ou métodos. Abaixo vemos a declaração básica de uma classe de Nome Class1, dentro de um NameSpace Namespace GoodSoftware Public Class ERP '... End Class End Namespace namespace GoodSoftware { public class ERP { // } } Você não é obrigado a criar uma classe dentro de um NameSpace. Não é preciso existir relação entre nomes de classes e namespaces com o nome fisico do arquivo. Você pode inclusive colocar diversas classes ou namespaces dentro de um mesmo arquivo. Um construtor de uma classe em VB.NET se define com a palavra chave New, já em C# deve ter no mome da classe Public Sub New()... End Sub public Class1 () { // } Obviamente que você pode criar um construtor com passagem de parametros. Já as propriedades são bastante singular em cada linguagem: 24

25 Public Property Nome() As String Get Return Pnome End Get Set(ByVal value As String) Pnome = value End Set End Property public String Nome { get { return Pnome; } set { Pnome = value; } } Uma propridade pode ser apenas leitura ou apenas escrita. Além de inicar estas caracteristica na declaração da propriedade, você deverá omitir as sentenças get e set, respectivamente. Caso você deseje criar um método que por algum motivo não precise ou não deva ter sua classe instanciada, basta você acrescentar a palavra chave shared no VB.NET ou static no C#, sempre após a declaração de visibilidade do método: Public Shared Function Somar(ByVal x As Integer, ByVal y As Integer) _ As Integer Dim z As Integer z = x + y Return z End Function public static int Somar(int x, int y) { int z; z = x + y; return z; } Lembre-se que um método definido com shared / static, não pode usar qualquer recurso da classe, como por exemplo uma variavel privada ou mesmo, uma propriedade ou um outro método. A herança de uma classe é definida pela palavra chave inherits em VB.NET e em C# através da notação : classe pai Public Class Class2 Inherits Class1 End Class 25

26 class Class2: Class1 { } Abaixo alguns outros recursos de OO do.net, não vou demonstrar exemplos porque extrapolam o objetivo básico desta sessão. A primeira palavra é a notação em VB.NET e a segunda em C#: Para se referir a classe base, utilize MyBase no VB.NET ou base no C#, seguido do nome do método ou propriedade. NotInheritable / sealed: Também conhecido com Classe Fechada, indica que uma classe não pode ser usada como base, ou seja, nenhuma outra classe poderá herdá-la MustInherit / abstract: Define uma classe abstrato, onde apenas uma classe filho poderá ser instanciada. Overloads: permite que um método seja sobrecarregado, ou seja, que possa haver métodos com a mesma função, porém com assinaturas diferentes. O uso do termo é desnecessário tanto em VB.NET quanto em C#, pois o ambiente entende que métodos com o mesmo nome porem com assinaturas diferentes estão sobrecarregados. Overridable / virtual: Indica que uma classe filho deve programar uma nova versão do método. Overrides / override: Utilizado para sobrescrever uma implementação na classe pai. MustOverride: Em uma classe marcada como MustInherit. Indica que o método ou propriedade deve não foi implementado na classe pai e deve ser implementado na classe derivada. Interfaces Interfaces é um recurso que permite criar uma padronização maior entre classe. Uma interface é uma assinatura, que compreende nada mais que métodos e propriedades ocas. Uma classe que programe determinada interface deve obrigatoriamente seguir essa assinatura. Você pode definir que determinada classe implemente determinada interface para ter uma certa funcionalidade. 26

27 Confuso? Vou citar um exemplo: você pode conectar tanto um array quanto um SqlDataSource a um GridView, pois ambos implementam a interface System.Collections.IEnumerable. Interface Interface1 Sub Metodo1() Function Metodo2() As Integer End Interface Public Class UsaInterface Implements Interface1 Public Sub Metodo1() Implements Interface1.Metodo1 ' End Sub Public Function Metodo2() As Integer Implements Interface1.Metodo2 ' End Function End Class public interface Interface1 { void Metodo1(); int Metodo2(); } public class UsaInterface : Interface1 { public void Metodo1() { // } public int Metodo2() { // } } Como um ambiente de alta produtividade, O VS vai criar automaticamente pra você todas as estruturas que precisam ser implementadas na classe, no momento que você informar que deseja utilzar determinada interface. O.NET não suporta herança multipla, porém uma classe pode implementar diversas interfaces. Utilizando o IIS Certifique-se que o IIS esta devidamente instaldo e rodando. 27

28 Ao contrario do seu entecessor, o VS 2005 e 2008 vem com um pequeno servidor Web embutido. Porém devido as limitações deste, vamos trabalhar com IIS. Para criar uma nova aplicação usando o IIS siga os seguintes passos: Na IDE do VS selecione File / New Web Site; Na caixa de dialogo New Web Site selecione ASP.NET Web Site; Clique em Browse; Na caixa de dialogo Chose Location, selecione Local IIS; Selecione Site da Web Padrão; Clique em Create New Web Aplication; Digite um nome para sua aplicação, no exemplo Teste; 28

29 Clique em Open; De volta a new Web Site, clique em Ok.; 29

30 3. Web Forms Um Web Form é uma pagina de sua aplicação. Na IDE do VS ele se comporta de forma semelhante a um Windows Form: Uma área onde você pode arrastar e soltar controles visuais, codificar eventos e configurar propriedades que vão regrar seu comportamento. Fisicamente, um Web Form é composto por um arquivo com extensão aspx e, dependendo do modelo adotado, poderá ou não estar vinculado a ele um arquivo vb ou cs, com a codificação para execução no servidor. Abaixo você vê o código gerado pelo próprio VS na criação da um Web Form: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html xmlns=" > <head runat="server"> <title>untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html> Nesta página você alguns dos principais elementos que formam uma pagina HTML padrão, como as tags Html, Head, Body, Form e Title. Todos controles e todo conteúdo de apresentação de seu formulário, vai estar entre as Tags Body. Diretivas Na primeira linha da página temos uma diretiva de página. Uma diretiva é representada pelo símbolo <%@. O que nos diz que se trata de uma diretiva de página é palavra page, logo após a abertura da tag. Uma diretiva de página possuiu algumas informações que serão úteis ao compilador no momento da geração da pagina. No código acima, vemos que na diretiva criada por padrão pelo VS, temos já diversos atributos, você pode alterá-las ou mesmo inserir diretivas especificas, desde obviamente que você saiba o que esta fazendo. 30

31 Abaixo veremos as principais diretivas existentes no ASP.NET Diretiva de um User Control (arquivo Diretiva de uma Máster Diretiva de controle de Vincula um assembly a Importa um namespace Diretiva de um Web Form (arquivo aspx Cada diretiva pode conter n atributos. Os atributos são configurações que na verdade ditam as funcionalidades da diretiva. Veremos a seguir os principais atributos da AutoEventWireUp: Determina que os eventos de uma página sejam disparados automaticamente ClassName: Especifica o nome da classe relacionada a página CodeFile: Especifica o arquivo code-behind da página Culture: Especifica as configurações de cultura da página Debug: Compila a página com os símbolos de depuração EnableSessionState: Indica se é permitido armazenamento de sessão na página EnableTheming: indica se é permitido o uso de temas na página EnableViewState:Indica se o viewstate será mantido na página Language: Defina a linguagem em que a página é codificada SmartNavigation: Habilita os recursos do SmartNavigation na página Theme: Defini um tema especifico para a pagina ValidateRequest: Indica se a requisição será validada. Quando este atributo esta com verdadeiro, se existir algum conteúdo potencialmente perigoso postado na página, será gerada uma exceção. No arquivo web.config ou mesmo até no machine.config, podemos configurar muitos dos atributos que também são configuráveis a nível de pagina. Normalmente a configuração através de diretiva de página sobrescreve a definida em um arquivo de configuração. 31

32 32

33 4. Controles Em seção posterior veremos os novos controles adicionados no ASP.NET 3.5, que como vimos na seção de novidades desta versão, são poucos. No ASP.NET 2.0 foram adicionados de cerca de 50 novos controles de servidor. Alguns presentes na versão 1.x, como o DataGrid, não estão mais disponíveis na caixa de ferramentas, porém podem ser facilmente adicionados. Não estudaremos detalhadamente todos os Server Controls. Você pode criar uma aplicação utilizando basicamente dois grandes grupos de controles: controles HTML, que são os controles padrão conhecidos e Server Controls, ou controles de servidor. Você pode criar aplicativos usando apenas controles HTML, porém tenha um bom motivo para fazer isto. Server Controls são controles ricos em funcionalidade, que podem ter seus eventos ou propriedades manipulados no código executado no servidor. Todo controle de servidor é codificado através de uma tag ASP, que não é HTML padrão que conhecemos. Em tempo de execução, o ASP.NET renderiza esta tag em HTML otimizado para o navegador em que a aplicação é executada. Por exemplo, um dos controles mais simples é o Label. Ao colocar um Label em um WebForm o VS gera o seguinte código: <asp:label ID="Label1" runat="server" Text="Label"></asp:Label> Você pode gerenciar a apresentação de seu site manualmente, se preferir. Ao executarmos a aplicação, a tag ASP:Label é renderizado em uma tag span: <span id="label1">label</span> 33

34 O atributo runat=server não define que o controle é um controle de servidor, mas sim que ele será visível no código executado no servidor. Isto significa que se adicionarmos este atributo a um controle HTML, este também poderá ser manipulado no servidor, porém de forma mais pobre: <input id="text1" runat="server" type="text" /> Não estudaremos controles HTML. Acessando eventos e propriedades de controles Na caixa de propriedades, clicando no botão Events, você tem uma relação de todos os eventos possíveis para um determinado controle. Para que o VS crie automaticamente um manipulador para o evento basta dar um duplo clique no nome. Alguns manipuladores podem ser criados quando clicamos sobre o próprio controle, como o evento Click de um Button: Protected Sub Button1_Click(ByVal sender As Object,ByVal e _ As System.EventArgs) Handles Button1.Click End Sub protected void Button1_Click(object sender, EventArgs e) { } Junto com o evento são passadas duas propriedades, sender, do tipo object, que contem o objeto que disparou o evento, e e, propriedades especificas do evento. do tipo EventArgs, que contem algumas Ler ou alterar propriedades de um controle é feito no modelo controle.propriedade, como nos exemplos abaixo: Protected Sub Button1_Click(ByVal sender As Object, ByVal e _ As System.EventArgs) Handles Button1.Click Button1.Text = "Gravar" Button1.ToolTip = "Clique Aqui para Gravar" End Sub 34

35 protected void Button2_Click(object sender, EventArgs e) { Button1.Text = "Gravar"; Button1.ToolTip = "Clique Aqui para Gravar"; } Você pode definir que mais de um controle dispare um mesmo manipulador de evento, internamente basta você verificar qual foi o controle que causou o evento. De uma maneira geral, para ambas as linguagens, basta você selecionar o evento no dropdown na caixa de propriedades. O interessante é como o VS trata isto em tempo de design de forma tão diferenciada. No C# o nome do manipulador do evento é colocada no arquivo ASPX, no atributo OnClick. No VB.NET, é adicionado o nome do controle ao grupo handles, ao final da assinatura do evento. O resultado em tempo de execução obviamente é o mesmo. Propriedades Comuns Algumas propriedades são comuns, se não a todos, mas a maioria dos controles. Vamos vê-las agora: ID: O nome do controle, deve ser único BackColor: Cor de fundo do controle BorderColor: Cor de Borda do Controle BorderStyle: Estilo da borda do Controle BorderWidt: Largura da borda do controle CssClass: Indica a classe CSS a ser aplicada no controle Enabled: indica se o controle esta habilitado EnableTheming: Indica se é o tema do controle estará ativo EnableViewState: Indica se o controle vai armazenar seu estado no viewstate da pagina Font: Fonte do controle SkinID: Indica o ID do skin a ser utilizado. Skins serão estudados mais adiante Text: Representa o texto que será exibido ao usuário da aplicação ToolTip: é a dica que será exibida ao usuário quando este posicionar o mouse sobre o controle. 35

36 Uso de HotKeys Duas propriedades novas e interessantes, que estão presentes em alguns controles, são AcessKey e AssociatedControlID. Com a primeira definimos uma tecla de atalho para o controle, que no navegador e acionado junto com a tecla ALT. Já com AssociatedControlID podemos definir qual o controle vai receber o foco no caso da combinação de teclas ser acionadas. Este recurso é conhecido como HotKeys. Vamos estudar agora os três principais controles de servidor, que formam um conjunto básico para a criação de qualquer aplicativo. Label Um controle simples, porém poderoso, que nos permite exibir algum texto em uma página Web. Todas suas propriedades podem ser manipuladas no código gerado no servidor. Alguns exemplos de codificação de controles, mostram primeiro em tempo de design (ASP) e em seguida em tempo de execução (HTML). É definido pela a tag ASP:Label e quando executado renderizado em uma tag span: <asp:label ID="Label1" runat="server" Text="ASP.NET 3.5 Rules!!"></asp:Label> span id="label1">asp.net 3.5 Rules!!</span> TextBox O textbox é um controle de edição simples. Através da propriedade TextMode podemos utilizá-lo ainda para receber senhas ou mesmo transforma-lo em um controle com múltiplas linhas. Uma novidade é a propriedade AutoCompleteType, que pode receber apenas valores pré-definidos. Ao preencher um segundo controle com o mesmo valor para esta propriedade, o navegador deverá sugerir o preenchimento do valor informado no primeiro campo. È definido pela a tag ASP:TextBox e quando executado renderizado em uma tag input do tipo text ou password ou então textarea, de acordo com a propriedade textmode. 36

37 <asp:textbox ID="TextBox1" runat="server">normal</asp:textbox> <asp:textbox ID="TextBox2" runat="server" TextMode="Password">Senha</asp:TextBox> <asp:textbox ID="TextBox3" runat="server" TextMode="MultiLine">MultiLine</asp:TextBox> <input name="textbox1" type="text" value="normal" id="textbox1" /> <input name="textbox2" type="password" id="textbox2" /> <textarea name="textbox3" rows="2" cols="20" id="textbox3">multiline</textarea> Button O button é um botão de comando básico. Sua principal função é causar um post back para a execução de algum código no servidor. O principal evento é Click, que, obviamente, é disparando quando clicamos no botão. É renderizado em uma tag input do tipo submit. <asp:button ID="Button1" runat="server" Text="Button" /> <input type="submit" name="button1" value="button" id="button1" /> Uma importante propriedade é a PostBackUrl, que indica para qual página será executado o post back. Para exemplificar, o código abaixo lê a um TextBox de um formulário que originou o PostBack: Dim Nome As String = CType(PreviousPage.FindControl("Nome"), _ TextBox).Text LinkButton O controle linkbutton é uma mistura de botão de comando com HyperLink. Sua aparência é de um Link, seu comportamento e suas propriedades o assemelham a um Button. Não existe propriedade NavigateUrl, o redirecionamento deve ser codificado no post back ou através da propriedade PostBackUrl. <asp:linkbutton ID="LinkButton1" runat="server">linkbutton</asp:linkbutton> Nos bastidores, o LinkButton renderiza uma tag a, cujo atributo Href, ao invés de conter uma URL, dispara uma função Java Script gerada pelo ASP.NET. 37

38 <a id="linkbutton1" href="javascript: dopostback('linkbutton1','')">linkbutton</a> ImageButton Um ImageButton é um botão de comando onde podemos adicionar uma imagem para exibição. Possui todas as funcionalidades do Button, mais a propriedade ImageURL onde definimos a imagem. Em tempo de execução é renderizado como Input do tipo Image. <asp:imagebutton ID="ImageButton1" runat="server" ImageUrl="web.gif" /> <input type="image" name="imagebutton1" id="imagebutton1" src="web.gif" /> HyperLInk O hyperlink permite criar links de navegação, sua propriedade mais importante é NavagateURL, que é valor para a atribuo HREF. É um controle simples que é renderizado com uma tag a. Seu poder maior esta na possibilidade de, por exemplo, definir a URL dinamicamente no código do servidor. Através de uso de HotKey pode-se ainda facilitar a navegação na pagina. A propriedade text define o texto de exibição, já ImageUrl pode definir uma imagem a ser exibida ao invés do texto. <asp:hyperlink ID="HyperLink1" runat="server" NavigateUrl=" Aqui</asp:HyperLink> <a id="hyperlink1" href=" Aqui</a> CheckBox O checkbox gera um controle HTML input do tipo checkbox <asp:checkbox ID="CheckBox1" runat="server" Text="Lembrar" /> <input id="checkbox1" type="checkbox" name="checkbox1" /> 38

39 RadioButton O RadioButton gera um controle HTML input do tipo radio <asp:radiobutton ID="RadioButton1" runat="server" Text="Lembrar" /> <input id="radiobutton1" type="radio" name="radiobutton1" value="radiobutton1" /> Image O controle Image deve ser utilizado para exibição de Imagens. A imagem a ser exibida deve ser definida através da propriedade ImageUrl. <asp:image ID="Image1" runat="server" ImageUrl="web.gif" /> <img id="image1" src="web.gif" /> DropDownList e ListBox O DropDownList e ListBox são controles altamente poderoso. Suas propriedades e eventos trazem recursos que só poderiam ser obtidos com muita mão de obra em uma aplicação WEB. A propriedade AutoPostBack, causa um post back automático ao servidor quando um valor é selecionado. Os controles podem ter seus itens adicionados em tempo de design ou de execução, através da propriedade Itens. Também é possível vinculá-lo a uma fonte de dados qualquer, que pode ser um array, um dataset ou mesmo um SqlDataSource, só para citar alguns. Para cada item é possível ler e escrever um texto e um valor, armazenados nas propriedades text e value, respectivamente. Isto é muito útil, por exemplo, para recuperar o código de um item selecionado pelo usuário. <asp:dropdownlist ID="DropDownList1" runat="server"> <select name="dropdownlist1" id="dropdownlist1"> O exemplo abaixo adiciona um item a um DropDownList: DropDownList1.Items.Add("Selecione uma opção") 39

40 DropDownList1.Items.Add("Selecione uma opção"); Para recuperar o valor da propriedade text bem como value basta ler as propriedades específicas: Dim s As String = DropDownList1.SelectedValue Dim t As String = DropDownList1.SelectedItem.Text string s = DropDownList1.SelectedValue; string t = DropDownList1.SelectedItem.Text; O evento SelectedIndexChange é executado quando um item do controle é selecionado. Se a propriedade AutoPostBack estiver marcada como verdadeira, um postback é executado imediatamente, caso contrário o evento só será executado no próximo postback. Existem ainda diversos métodos interessantes, como itens.clear, que limpa os itens, e propriedades, como itens.count, que retorna o número de itens no controle. CheckBoxList e RadioButtonList Os controles CheckBoxList e RadioButtonList em tempo de design são apresentados como um conjunto de controles CheckBox e RadioButton, que podem ter suas propriedades gerenciadas mais facilmente e conectados a uma fonte de dados qualquer. Em tempo de execução, o ASP.NET renderiza cada controle como diversos controles input do tipo checkbox ou radiobutton. No exemplo abaixo o código verifica se um determinado item de um If CheckBoxList1.Items(0).Selected = True Then '' End If if (CheckBoxList1.Items[0].Selected==true) { // } 40

41 Calendar O Calendar é um calendário que é renderizado utilizando uma tag table, e na sua forma mais simples tem pelo menos 7 KB de texto. É excelente para exibição e entrada de datas. Possuiu um conjunto poderosíssimo de propriedades, métodos e eventos que permitem praticamente exibi-lo de qualquer forma imaginada. Entre seus eventos mais significativos, temos o SelectionChange, que é disparado quando ocorre uma alteração na seleção do calendário, e VisibleMonthChange, que ocorre quando o mês visível no calendário é alterado. A propriedade SelecteDate nos permite ler a data selecionada. No exemplo abaixo um label exibe a data selecionada pelo usuário: Protected Sub Calendar1_SelectionChanged(ByVal sender As _ Object, ByVal e As System.EventArgs) Handles _ Calendar1.SelectionChanged Lbldata.Text = String.Format("A data selecionada é {0:d}",_ Calendar1.SelectedDate) End Sub protected void Calendar1_SelectionChanged(object sender, EventArgs e) { Lbldata.Text = String.Format("A data selecionada é {0:d}", Calendar1.SelectedDate); } Através das propriedades SelectionMode podemos definir se o usuário poderá selecionar um único dia, uma semana, um mês inteiro ou nada. Caso ele possa selecionar, por exemplo, uma semana, podemos recuperar os dias selecionados através de um laço for each, que percorre a coleção de objetos DateTime da propriedade SelectedDates: Dim s As System.DateTime For Each s In Calendar1.SelectedDates ListBox1.Items.Add(String.Format("Data Selecionada {0:d}", s)) Next 41

42 foreach (System.DateTime s in Calendar1.SelectedDates) { ListBox1.Items.Add(String.Format("Data Selecionada {0:d}", s)); } AdRotator O AdRotator nos permite incluir um banner em nosso site, onde o próprio ASP.NET através de um arquivo de configuração, vai cuidar da rotatividade das exibições de imagens. O segredo todo está em um arquivo de configuração, que pode ser um XML ou mesmo uma tabela de banco de dados. Para testar este controle, crie um arquivo XML dentro do diretório App_Data de sua aplicação (se não existir o diretório, crie-o também), com o seguinte texto: <?xml version="1.0" encoding="utf-8"?> <Advertisements> <Ad> <ImageUrl>~/imagens/cafezinho.bmp</ImageUrl> <NavigateUrl> <AlternateText>Café</AlternateText> <Keyword>Café</Keyword> <Impressions>40</Impressions> </Ad> <Ad> <ImageUrl>~/imagens/deserto.bmp</ImageUrl> <NavigateUrl> <AlternateText>Deserto</AlternateText> <Keyword>Site Deserto</Keyword> <Impressions>20</Impressions> </Ad> </Advertisements> Certifique-se que você tem uma pasta imagens com as imagens informadas. Você pode configurar os parâmetros de acordo com sua preferência: NavigateUrl é a URL para qual o usuário será direcionado quando clicar no banner, AlternateText é o texto a ser exibido no local da imagem. Impressions representa o número de impressões do banner. No exemplo acima, note que o primeiro banner deverá aparecer em dobro. Para vincular o seu AdRotator ao arquivo XML basta informá-lo na propriedade AdvertisementFile. Um arquivo XML é sensível a caracteres maiúsculos e minúsculos. 42

43 View e MultiView Mais uma novidade surgida no ASP.NET 2.0. Provavelmente você já necessitou que parte de sua aplicação ficasse invisível em determinados momentos. Claro que isso não era uma tarefa impossível, mas com os controles MultiView e View isto ficou mais simples. A idéia é: Dentro de um Multiview você agrega um ou mais Views. Em cada um dos Views você coloca controles conforme a necessidade. A partir daí é só determinar qual View estará visível através da propriedade ActiveViewIndex. MultiView1.ActiveViewIndex = 0 MultiView1.ActiveViewIndex = 0; Wizard Continuando com as novidades, o Wizard é um assistente para páginas Web, onde você pode determinar passos (Steps). Em cada Step você tem uma área onde pode colocar seus controles conforme a necessidade. Entre os eventos tempos NextButtonClick, que é disparado sempre que o usuários clicar no botão Next, FinishButtonClick, disparado no encerramento, e CancelButtonClick, disparado ao final. O mais interessante de tudo é que Wizard mantém estado de tudo o que é colocado em seus passos. Isto significa que você pode fazer o processamento dos dados ao final do assistente. O controle é totalmente configurável, desde aparências até texto dos botões. Controles de validação 43

44 O ASP.NET desde sua primeira versão tem integrador alguns controles que permitem validar entradas do usuário, tanto no cliente como no servidor, de forma simples e rápida. A partir da versão 2.0 foi incluía a propriedade ValidationGroup, que permite que agrupemos grupos diferentes de validação em um mesmo WebForm. Na versão anterior isto era um problema, ou fazíamos a validação manualmente ou dividíamos a nossa lógica de negocio em dois formulários diferentes. Na versão 3.5 não houveram novidades em relação aos controles de validação. Os controles de validação são: RequiredFieldValidator: Permite validar se um controle foi preenchido. RangeValidator: Permite verificar se o valor informado esta entre determinado intervalo. RegularExpressionValidator: Permite validar o valor informado com uma expressão regular CompareValidator: Permite comparar dois valores. CustomValidator: Permite que customizemos nossa expressão de validação. Um controle de validação vai exibir uma mensagem caso a validação falhe. Com o controle ValidationSummary podemos agrupar as mensagens de todos os controles em um único local ou numa mesma caixa de dialogo. Se você quer garantir que um controle tenha um valor preenchido e seja, por exemplo, um inteiro maior que zero, você terá que usar além de um RangeValidator um RequiredFiledValidador, apenas este último obriga o preenchimento do valor. Um controle de validação tem duas propriedades para exibição de mensagens: Text e ErrorMessage. Se você utilizar um ValidationSummary você pode trabalhar com as duas: A mensagem em ErrorMessage será exibida no ValidationSummay, e text no proprio controle de validação (um * por exemplo). 44

45 Para criar grupos de validação, basta escolher um nome para o grupo e preencher as propriedades ValidationGroup tanto dos controles a serem validados quanto dos controles de validação. Se você quiser causar um post back sem disparar os validadores, basta setar a propriedade CausesValidation do controle para False. Para obrigar o preenchimento de um textbox: Coloque num formulário um controle TextBox, um RequiredFieldValidator e um ValidationSummary e um Button; Configure a propriedade ControlToValidade do RequiredFieldValidator para o TextBox adicionado no furmaulario; Preencha a propriedade text do RequiredFieldValidator para *, e ErrorMessage para Preenchimento Obrigatório ; Configure a propriedade ShowMessageBox do ValidationSummary para true, e ShowSummary para false; Rode a aplicação; Clique no botão sem preencher qualquer informação no textbox. 45

46 Por fim, para verificar também no servidor se todas as validações foram feitas, verifique a propriedade isvalid da página. 5. Master Pages É comum em aplicações convencionais ou mesmo Web a necessidades de criarmos partes de conteúdo que serão exibidas em todas ou pelo menos em diversas páginas. No ASP clássico isso era resolvido da seguinte forma: Você desenvolvia o conteúdo separadamente e sua inclusão era feito onde necessário através de uma tag Include. No ASP.NET 1.1 surgiu uma novidade: os chamados Web User Controls, que são arquivos com a extensão ascx, que podiam ser programados na IDE do Visual Studio e adicionados a qualquer Web Form. Trouxe significativas vantagens em relação ao uso 46

47 do include, como o fato da pagina host ter a possibilidade de ler ou alterar valores de controles ou propriedades. Sua grande desvantagem era que não possuía herança visual como já há um longo tempo era possível em aplicações convencionais: O user control em tempo de design eram representados na IDE do VS como um botão cinza. No ASP.NET 2.0 uma das grandes novidades apresentadas e que obviamente continuam disponíveis na versão 3.5 são as Master Pages, que trazem finalmente a herança de conteúdo de forma visual. Uma MasterPage é um arquivo com extensão master. Pode ser criada no IDE do VS no modelo code-behing ou code-inline, assim como um Web Form. Sua estrutura básica também é muito parecida com um Web Form: <%@ Master Language="VB" CodeFile="Master.master.vb" Inherits="Master" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html xmlns=" > <head runat="server"> <title>untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:contentplaceholder id="contentplaceholder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> </html> A principal diferença é a diretiva de no lugar Esta diretiva informa ao ASP.NET durante o processo de compilação que trata-se uma Master Page. Uma página aspx que utiliza uma Master Page é chamada de página de conteúdo (Content Page). Uma página de conteúdo não contem os elementos que formam uma página HTML comum, pois estes serão herdados da Master Page. Numa Master Page, 47

48 as áreas onde uma pagina de conteúdo terão disponível para exibir seu conteúdo são definidas através de controles de servidor contentplaceholder. No código acima você pode ver um controle contentplaceholder criado por padrão na criação da MasterPage. Criando uma Master page Criar uma Master Page no Visual Studio é simples: Na caixa de dialogo Add New Item Selecione Master Page, defina um nome para a página. O VS cria a MasterPage com o nome escolhido. Se você optou pelo modelo code-behind, serão criados dois arquivos: um arquivo master e um vb ou cs, conforme a linguagem escolhida. Se a opção foi code-inline, será criado apenas o arquivo.master. Utilizando uma Mater Page Definir a(s) página(s) de conteúdo é simples e pode ser feito quatro maneiras diferentes: Durante a criação da página, na caixa de dialogo Add New Item, marque a opção Select Master Page 48

49 Será exibida a caixa de dialogo Master Page, que exibe as Master Pages disponíveis no projeto: Baste selecionar a página Master e clicar em Ok. A segunda é através da própria pagina Master, selecionando a opção Add Content Page. Será criada uma página de conteúdo em branco. Você não poderá escolher o nome da página no momento da sua criação. A terceira é de forma manual. Crie um Web Form normalmente, remova todo o HTML gerado, com exceção da diretiva de página. Adicione a diretiva de página o atributo MasterPageFile, que indica que esta é uma página de conteúdo que utiliza a Master Page especificada no atributo. Finalmente, a quarta e última, e em tempo de execução: 49

50 Protected Sub Page_PreInit(ByVal sender As Object, ByVal e _ As System.EventArgs) Handles Me.PreInit Page.MasterPageFile = "~/MasterUm.master" End Sub protected void Page_PreInit(object sender, EventArgs e) { Page.MasterPageFile = "~/MasterUm.master"; } A defninição de uma pagina Master em tempo de execução deve ser feito no evento PreInit da página. Obviamente que esta última forma nos priva dos beneficios da herança visual. Trabalhando com uma Master Page Nesta sessão vamos demonstrar de maneira prática como tirar proveito da utilização de uma Master Page. Este não é um curso de Web Design, portanto não perca tempo ou se preocupe com a aparência de suas atividades práticas. Crie uma nova aplicação ASP.NET; Crie uma nova Master Page; Defina o layout da Master Page de acordo com a figura abaixo: 50

51 Para os quatro controles da esquerda, que deverão funcionar como HyperLinks, utilize controles de Servidor HyperLinks, defina a propriedade text de cada um como Desentupimento, Hidráulica, Limpeza e Hidrojateamento. A propriedade NavigateUrl de cada um deve ser definida pelo mesmo conteúdo da propriedade text mais a extesão aspx, por exemplo: Desentupimento.aspx. Crie quatro páginas de conteúdo com os nomes especificados nas propriedades NavigateUrl acima, especificando como Master Page a página criada. Defina um conteúdo especifico para cada página de conteúdo, conforme exemplo abaixo: Na área Content da página de conteúdo você pode trabalhar livremente: adicionar controles, eventos etc. 51

52 Defina uma das páginas de conteúdo criada como página inicial e rode a aplicação. Navega entre as páginas e veja na prática o funcionamento da aplicação. Acessando a página Master da página de conteúdo Você pode facilmente acessar qualquer controle ou propriedade da página Master, na página de conteúdo, através da propriedade Master. Por exemplo, para ler o conteúdo de um dos HyperLinks da página Master: If Not Page.IsPostBack Then Dim s As String = CType(Master.FindControl _ ("Desentupimento"), HyperLink).Text End If if (!Page.IsPostBack) { string s = (Master.FindControl("Desentupimento") as HyperLink).Text; } 52

53 Também podemos alterar o texto ou mesmo qualquer propriedade do controle na Master Page, pois nossa operação é por referencia: Dim Hyper As HyperLink Hyper = CType(Master.FindControl("Desentupimento"), HyperLink) Hyper.ForeColor = System.Drawing.Color.Red HyperLink Hyper; Hyper = (Master.FindControl("Desentupimento") as HyperLink); Hyper.ForeColor = System.Drawing.Color.Red; Neste exemplo, estamos mudando a cor do HyperLink do conteúdo da página Master para vermelho. Alterando o Título das páginas de conteúdo A página de conteúdo deve conter um atributo title, onde deve ser definido o titulo para exibição da página. Na ausência deste, será exibido o titulo da Master Page. Outra alternativa é definir no código o título para a página: Master.Page.Title = "Titulo definido em tempo de execução" Master.Page.Title = "Titulo definido em tempo de execução"; Trabalhando com conteúdo padrão Outra possibilidade interessante é a de trabalhar com conteúdo padrão. Você pode definir um conteúdo padrão de exibição na área da página de conteúdo, da mesma forma que você define o restante da página. Na página de conteúdo, para exibir o conteúdo padrão, basta clicar em Default to Master Content na Smart Tag do controle de conteúdo. Master Pages aninhadas Alem de tudo o que estudamos, é possível mais. Você pode criar Master Pages aninhadas, em diferentes níveis. O VS 2005 não da suporte em sua IDE para este recurso, portanto você terá que fazer todo o trabalho manualmente. 53

54 54

55 6. Themes e Skins A formatação de suas páginas ASP.NET poderão ser feitas de diversas maneiras, entre elas: Uso de arquivos CSS; Formatação diretamente nas pagina. Utilizando o novo recurso de temas, é possível definir um padrão para toda a aplicação sem necessidade de altera qualquer página. As possibilidades são muitas, vamos ver um exemplo prático. Crie uma nova aplicação ASP.NET; Crie um WebForm com os seguintes controles: Crie a pasta App_themes. Esta é uma pasta de sistema do ASP.NET. Para criá-la acesse o menu WebSite, ASP.NET Folder, Themes. Na caixa de dialogo Add New Item exibida em seguida, selecione Skin File, de o nome de Red. Clique sobre o botão direito sobre a pasta Themes e crie um novo Skin, desta vez com o nome Gray. 55

56 A formatação de controles num Skin é definida usando a própria tag de definição do controle, obviamente que alguns atributos não deverão ser utilizados, como ID ou text. No exemplo abaixo o definição para o Skin Red: <asp:label runat="server" Font-Names="Arial" ForeColor="Maroon" /> <asp:button runat="server" Font-Bold="True" ForeColor="Maroon" /> <asp:radiobutton runat="server" Font-Names="Arial" ForeColor="Maroon" /> <asp:checkbox runat="server" Font-Names="Arial" ForeColor="Maroon" /> Já o skin Gray fica assim: <asp:label runat="server" Font-Names="Verdana" ForeColor="Gray" /> <asp:button runat="server" Font-Bold="True" ForeColor="DimGray" /> <asp:radiobutton runat="server" Font-Names="Verdana" ForeColor="Gray" /> <asp:checkbox runat="server" Font-Names="Verdana" ForeColor="Gray" /> Agora vamos definir que sua página ASP.NET vai utilizar um Theme. Clique sobre o formulário e localize a propriedade Theme, note que todos os temas criados estão disponíveis: 56

57 Escolha o tema Red. Nos bastidores o tema escolhido é adicionado em uma diretiva da página: <%@ Page Language="VB" Theme="RED" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> Rode a aplicação e observe o resultado. 57

58 Altere o tema para Gray e rode a aplicação novamente. Definindo o tema dinamicamente Você pode definir o tema durante a execução do programa, através de uma escolha do usuário, por exemplo. Para isto basta alterar a propriedade Theme da página: 58

59 Page.Theme = "red" Page.Theme = "Red"; Definindo um tema para toda a aplicação Você também pode definir um tema no arquivo de configuração da aplicação, no nó system.web. Esta configuração será aplicada automaticamente para todas as páginas da aplicação: A alteração de tema dinamicamente deve ser feita no evento PreInit da página. <pages theme="red" > O nó pages já deve existir no seu arquivo de configuração, localize-o ao invés de criar um novo nó. Vale lembrar que uma configuração de página sobrescreve a de aplicação. Portanto se em determinada página você não quiser usar o tema padrão da aplicação, basta definir o tema desejado na página. Apresentação diferenciada Se você precisar dar uma apresentação diferente para um determinado controle que já esta definido no arquivo skin, você pode criar um nova definição deste controle adicionando a ele um SkinId. Para exemplificar, vamos alterar o arquivo skin Red de maneira que o titulo da página, Cadastro, seja exibido maior e de outra cor. Primeiramente alteramos nosso arquivo Red: <asp:label runat="server" Font-Names="Arial" ForeColor="Maroon" /> <asp:label SkinId="Titulo" runat="server" Font-Names="Arial" Font- Size="X-Large" ForeColor="Black" /> <asp:button runat="server" Font-Bold="True" ForeColor="Maroon" /> <asp:radiobutton runat="server" Font-Names="Arial" ForeColor="Maroon" /> <asp:checkbox runat="server" Font-Names="Arial" ForeColor="Maroon" /> Observe que foi adicionada uma nova tag asp:label, com SkinID como Titulo. Agora basta na página, alterar a propriedade SkinID do controle para Titulo: 59

60 Certifique-se que sua página esta utilizando o Skin Red. Rode a aplicação: 60

61 7. Navigation Surgido no ASP.NET 2.0, são uma série de controles para auxiliar a navegação do usuário. Estes controles podem ser encontrados no grupo Navigation da barra de ferramentas do VS 2008, são eles: SiteMapPath Menu TreeView SiteMapPath O controle SiteMapPath permite exibir um mapa de navegação para o usuário, numa estrutura hierárquica a partir da página raiz da aplicação. Para demonstrar as funcionalidades do controle, vamos criar um suposto aplicativo de comércio eletrônico, com a seguinte estrutura: 61

62 A funcionalidade do controle SiteMapPath esta baseada em arquivo xml denominado web.sitemap, que pode ser facilmente criado pela opção Add New Item. Sua estrutura básica é a seguinte: <?xml version="1.0" encoding="utf-8"?> <sitemap xmlns=" > <sitemapnode url="" title="" description=""> <sitemapnode url="" title="" description="" /> <sitemapnode url="" title="" description="" /> </sitemapnode> </sitemap> Trata-se de um arquivo XML padrão. O nó raiz é denominado SiteMap. A estrutura do site deve ser representada por nós SiteMapNode, onde estes devem ser organizados de forma a representar a estrutura hierárquica do site. O atributo Url define o endereço da página, Title o titulo a ser exibido no controle, e descrição o Tool Tip que também será exibido no controle. Importante ressaltar que o arquivo deve ser montado de forma hierárquica, ou seja, uma página deve ser adicionada dentro do nó sitemapnode da página hierarquicamente superior. Para nossa aplicação proposta anteriormente, montei o seguinte arquivo: <?xml version="1.0" encoding="utf-8"?> <sitemap xmlns=" > <sitemapnode url="index.aspx" title="página Principal" description="página Principal da Site"> <sitemapnode url="~/informatica/informatica.aspx" title="departamento de Informática" description="produtos de Informática"> <sitemapnode url="~/informatica/impressoras/impressoras.aspx" title="impressoras" description="vimpressoras Diversas" /> <sitemapnode url="~/informatica/monitores/convencionais/convencionais.aspx" title="monitores Convencionais" description="monitores Convencionais" /> <sitemapnode url="~/informatica/monitores/lcd/lcd.aspx" title="monitores LCD" description="monitores LCD" /> </sitemapnode> </sitemapnode> </sitemap> 62

63 Observe que as impressoras estão dentro do nó do departamento de informática. Se não criarmos o arquivo desta forma, da página do departamento de informática poderemos navegar apenas para a página inicial. Observe o sistema rodando: Você não precisa configurar nenhuma propriedade do controle SiteMapPath para o mesmo funcionar, desde que o arquivo Web.sitemapth esteja correto. Bbasta adicionar o controle ao Web Form. Analisando a janela de propriedades do SiteMapPath, você pode descobrir algumas coisas interessantes: Por exemplo, a propriedade Path Separator permite definir um caractere de separação entre os caminhos. Através da Smart Tag você também pode definir uma auto-formatação para seu controle. Menu O controle Menu permite adicionar as funcionalidades de um menu em uma aplicação Web. Seu uso é simples: após adicionar um controle a um Web Form, basta abrir o 63

64 editor de itens do menu através da Smart Tag do controle ou mesmo da janela de propriedades, onde é possível gerenciar o conteúdo do Menu. O editor de menu possui uma pequena barra de ferramentas com as seguintes funcionalidades: Add a root item: Add a child item: Remove an iten: Adiciona um novo item no mesmo nível da seleção atual Adiciona um novo item um nível acima da seleção atual Remove o item selecionado. Move the item up amongst its siblings: Move the item down amongst its siblings: Sobe o item verticamente; Desce o item verticalmente; Make the selected item a sibling of its parent: horizontalmente; Desce o item Make the selected item a sibling of its parent: Sobe o item horizontalmente. Cada item possui diversas propriedades configuráveis, as mais significativas são text, que indica o texto a ser exibido no item, e navigateurl: A URL de destino caso o usuário clique no item; 64

65 Adicionar os itens e configurar suas propriedades é tudo o que você precisa para tornar o controle funcional, mas isso não é tudo: Na smart tag do controle outra opção disponível é auto-format: Você pode dar um visual agradável ao seu menu sem muito trabalho. Entre as propriedades do menu, orientation define o comportamento do menu: Horizontal ou Vertical. Ligando seu Menu a um arquivo Web.sitemap Se você tem um arquivo Web.sitemap em sua aplicação, vimos que o controle SiteMapPath passa a utilizá-lo automaticamente, sem qualquer configuração ou alteração de propriedade. Um controle Menu também pode fazer uso do arquivo, porém você terá que ligá-los manualmente. É extremante simples: Adicione um controle SiteMapDataSource ao seu Web Form (disponível na Guia data da caixa de Ferramentas) No Menu, altera a propriedade DataSourceID para o controle SiteMapDataSource adicionado. Pronto! A partir de agora os itens de seu menu serão mapeados a partir do arquivo Web.sitemap que você criou anteriormente. 65

66 TreeView O terceiro controle que estudaremos no capitulo é o TreeView. Trata-se de um poderoso controle que nos permite exibir estruturas navegáveis e aninhadas. Sua configuração básica é simples, ao mesmo tempo em que prove uma grande quantidade de propriedades e alguns eventos que tornam o controle altamente poderoso e flexível. Para usar o controle basta adicioná-lo ao Web Form. Através da smart tag do controle podemos acessar um editor de itens idêntico ao do controle Menu: 66

67 Ainda na smart tag podemos definir um modelo de auto-formatação: A propriedade Show Lines também presente na smart tag do controle permite que sejam exibidas linhas entre o nó raiz e seus nós aninhados: 67

68 Definidas as propriedades de cada Item, o controle esta pronto para ser utilizado. Ligando seu TreeView a um arquivo Web.sitemap Um controle TreeView também pode fazer uso do arquivo Web.sitemap, o processo é o mesmo do Menu: Adicione um controle SiteMapDataSource ao seu Web Form (disponível na Guia data da caixa de Ferramentas) No Menu, altera a propriedade DataSourceID para o controle SiteMapDataSource adicionado. 68

69 Seleção Múltipla A propriedade ShowCheckBoxes permite que cada nó seja transformado em caixas de verificação, de forma que você poderá selecionar mais de um nó simultaneamente. Os valore possíveis para esta propriedade são: Root: Apenas os nós da raiz serão exibidos como caixas de verificação. Parent: Apenas os nós pais serão exibidos como caixas de verificação. Leaf: Apenas os nós folhas serão exibidos como caixas de verificação. All: Todos os nós serão exibidos como caixas de verificação. 69

70 Verificar programaticamente quais nós estão marcados é relativamente simples. Tudo a fazer é percorrer a lista de nós do controle usando um laço for next. No exemplo abaixo o código percorre a relação de nós e adiciona o texto do nó a um listbox: Dim node As TreeNode For Each node In TreeView1.CheckedNodes ListBox1.Items.Add(node.Text) Next foreach (TreeNode node in TreeView1.CheckedNodes) { ListBox1.Items.Add(node.Text); } Gerenciando o controle em tempo de execução Você também pode adicionar um nó programaticamente. No exemplo abaixo o nó é adicionado na raiz do TreeView: Dim node As New TreeNode node.text = "Móveis para escritório" node.navigateurl = "moveis.aspx" TreeView1.Nodes.Add(node) TreeNode node; node = new TreeNode(); 70

71 node.text = "Móveis para escritório"; node.navigateurl = "moveis.aspx"; TreeView1.Nodes.Add(node); Adicionar um nó aninhado a outro é um pouco mais complicado. Primeiro você deve localizar o nó pai utilizando o método FindNode, que recebe o caminho (path) do nó. Então basta adicionar um novo nó a sua coleção de nós filhos: Dim Atual As TreeNode = _ TreeView1.FindNode("PáginaPrincipal/Departamento de Informática") Dim Novo As New TreeNode Novo.Text = "Móveis para escritório" Novo.NavigateUrl = "moveis.aspx" Atual.ChildNodes.Add(Novo) TreeNode Atual = TreeView1.FindNode ("PáginaPrincipal/Departamento de Informática"); TreeNode Novo = new TreeNode(); Novo.Text = "Móveis para escritório"; Novo.NavigateUrl = "moveis.aspx"; Atual.ChildNodes.Add(Novo); Na imagem abaixo você pode ver o resultado: Para remover nós temos o método Remove. Finalmente, podemos recolher um TreeView em tempo de execução: 71

72 TreeView1.CollapseAll TreeView1.CollapseAll(); Ou mesmo expandir: TreeView1.ExpandAll; TreeView1.ExpandAll(); 72

73 8. WebParts WebParts não é um conceito novo, mas que surgiu a partir do ASP.NET 2.0 de forma fácil e poderosa. WebParts nos permite criar páginas com conteúdo gerenciável pelo usuário, onde esse pode arrastar controles, mudar aparências, ocultar o que não for preciso ou exibir novamente, enfim, traz para o ambiente Web uma interatividade completa entre o usuário e a aplicação, tudo isto com persistência. Modos Uma página ASP.NET utilizando WebParts pode estar em diferentes modos. Cada modo diz respeito ao comportamento do conteúdo da página e como o usuário poderá interagir com este conteúdo. Os quatro modos possíveis são: Normal: A página esta em modo normal, não permite quase nenhuma interatividade com o usuário; Catalog: Exibe a relação de seções da página, bem como permite ao usuário indicar em qual seção determinado item deverá permanecer. Permite restaurar controles que foram fechados. Design: Permite fazer o gerenciamento de zonas em uma página; Edit: Permite editar zonas de uma página WebPartManager O WebPartManager é um controle disponível na guia WebParts e é o responsável por todo o gerenciamento do conteúdo e de seu estado. É o principal controle e é obrigatório quanto trabalhamos com WebParts. O gerenciamento de estado e conteúdo do WebPartManager é feito utilizando um banco de dados do SQL Server 2005, de nome ASPNETDB.MDF, que pode ser encontrando dentro da pasta App_Data. 73

74 WebPartZone Outro controle importantíssimo e essencial é o WebPartZone. Através deste podemos definir as zonas onde serão agrupados o conteúdo da página. Este controle é um container para controles comuns, que de forma declarativa devem estar dentro da tag ZoneTemplate. Utilizando WebParts Crie uma nova aplicação ASP.NET; Coloque sobre o Web Form criado um controle WebPartManager; Coloque sobre o Web Form criado um controle WebPartZone; Através da Smart Tag escolha uma das opções de auto-formatação; Arraste para dentro do WebPartZone criado dois controles textbox; Rode a aplicação Com esta simplicidade nossa aplicação já contem alguma interatividade. Observe que cada controle dentro da WebPartZone pode ser minimizado ou fechando, através da seta a direita do controle: 74

75 Caso não apareça em sua aplicação o menu, ou mesmo se você não consegue alterar o modo de sua página, basta você autenticar o usuário que esta acessando a página, ou seja, não permitir acesso anônimo. A maneira mais simples de faz isto é utilizando autenticação integrada do Windows. Se você fechar um controle, não conseguirá mais restaurá-lo, mesmo que reinicie a aplicação. Isto porque o WebPartManager mantém o estado da aplicação. Na próxima seção veremos que no modo Catalog podemos trazer os controles fechados de volta ao formulário. Observe que no exemplo acima os controles possuem um texto personalizado, Primeiro e Segundo. Isto pode ser feito através do atributo Title de cada controle contido dentro da Zone Template. Isto deve ser feito de forma declarativa, pois esta não é uma propriedade do controle: <ZoneTemplate> <asp:textbox Title="Primeiro" ID="TextBox1" runat="server"></asp:textbox> <asp:textbox Title="Segundo" ID="TextBox2" runat="server"></asp:textbox> </ZoneTemplate> Você também pode personalizar os textos do Menu de controle através das propriedades CloseVerb e MinimizeVerb, procurando pelo atributo Text. Outras mensagens e rótulos que surgirão mais adiante poderão também ser personalizadas, basta procurar a propriedade equivalente. Modo Catalog Como dissemos o modo padrão de uma página é o Normal. Vamos ver agora como colocar uma página em modo Catalog, e quais as funcionalidades deste modo. Porém antes vamos criar mais duas zonas, para isto adicione mais dois novos controles WebPartZone ao formulário. Dentro do primeiro adicione dois controles Button, e no segundo dois controles CheckBox. Adicione um terceiro botão, alterando a propriedade text para Catalog, porém não o coloque dentro de nenhuma zona. Para que seja possível colocar a página em modo catalogo você deve adicionar um controle CatalogZone. De ao mesmo uma auto formatação. O Controle CatalogZone é um container para Catálogos de Página. Coloque um controle PageCatalogPart dentro do CatalogZone. 75

76 De um duplo clique sobre o botão Catalog, no manipulador de evento criado adicione o seguinte código: Dim mgr As WebPartManager mgr = WebPartManager.GetCurrentWebPartManager(Page) mgr.displaymode = mgr.supporteddisplaymodes.item("catalog") WebPartManager mgr; mgr = WebPartManager.GetCurrentWebPartManager(Page); mgr.displaymode = mgr.supporteddisplaymodes["catalog"]; O código acima declara um tipo WebPartManager e recebe o gerenciador da página por referencia, em seguida altera seu modo para Catalog. Rode a aplicação e a coloque no modo Catalog. Neste modo você pode: Restaurar um controle fechado. Note que através das zonas listadas no DropDownList Add to você pode inclusive restaurar o controle em outra zona: 76

77 Arrastar controles entre as zonas. Para isto basta clicar no titulo do controle e arrastá-lo até a posição desejada: 77

78 Você pode ainda querer voltar a página ao modo normal. Para isto adicione um novo botão externo a qualquer zona, coloque o titulo Normal e adicione o seguinte código: Dim mgr As WebPartManager mgr = WebPartManager.GetCurrentWebPartManager(Page) mgr.displaymode = mgr.supporteddisplaymodes.item("browse") WebPartManager mgr; mgr = WebPartManager.GetCurrentWebPartManager(Page); mgr.displaymode = mgr.supporteddisplaymodes["browse"]; Modo Design As alterações que o usuário faz nas zonas são persistentes, voltar ao modo normal não irá desfazê-las. Neste modo o usuário pode, alem de minimizar e fechar um controle, arrastá-los de uma zona para outra ou mesmo ordená-los, tarefas que são possíveis também no modo 78

79 Catalog, porém sem exibir o controle CatalogZone e sem possibilidade de mostrar um controle oculto. Veja abaixo um exemplo de como colocar a página em modo Design: Dim mgr As WebPartManager mgr = WebPartManager.GetCurrentWebPartManager(Page) mgr.displaymode = mgr.supporteddisplaymodes.item("design") WebPartManager mgr; mgr = WebPartManager.GetCurrentWebPartManager(Page); mgr.displaymode = mgr.supporteddisplaymodes["browse"]; Modo Edit O modo mais complexo e rico em funcionalidades é o modo de Edição. Através dele o usuário final poderá personalizar inúmeros aspectos dos controles, como aparência, comportamento e layout. O Modo de edição é possível com a adição do controle EditorZone, este também é um container, que pode receber um ApperanceEditorPart e/ou BehaviorEditorPart e /ou LayoutEditorPart e /ou PropertyEditorPart. Vamos os dois primeiros em funcionamento, para isso adicione um controle EditorZone a sua página e um button com a propriedade text configurada como Edit. No manipulador de evento do botão adicione o seguinte código: Dim mgr As WebPartManager mgr = WebPartManager.GetCurrentWebPartManager(Page) mgr.displaymode = mgr.supporteddisplaymodes.item("edit") WebPartManager mgr; mgr = WebPartManager.GetCurrentWebPartManager(Page); mgr.displaymode = mgr.supporteddisplaymodes["edit"]; É preciso fazer algumas configurações para o modo de edição funcionar. Primeiramente adicione o seguinte nó ao arquivo web.config de sua aplicação 79

80 <webparts> <personalization> <authorization> <allow users="*" roles="admin" verbs="entersharedscope"/> </authorization> </personalization> </webparts> Esta configuração deve estar dentro do nó system.web. Em seguida adicione o seguinte código ao evento PageLoad da página: If WebPartManager1.Personalization.Scope = PersonalizationScope.User _ AndAlso WebPartManager1.Personalization.CanEnterSharedScope Then WebPartManager1.Personalization.ToggleScope() End If if (WebPartManager1.Personalization.Scope = PersonalizationScope.User && WebPartManager1.Personalization.CanEnterSharedScope) { WebPartManager1.Personalization.ToggleScope(); } Para não tornar o aprendizado mais claro e simples, vamos estudar um os quatro editores existentes. ApperanceEditorPart Adicione um controle ApperanceEditorPart ao EditorZone. Rode a aplicação e clique em Edit para permitir que um controle entre em modo de edição. Observe que em todo o controle, no menu a esquerda, surge uma nova opção: Edit: 80

81 Ao clicar na opção Edit, as opções do controle ApperanceEditorPart que adicionamos ao container são exibidas, você pode alterá-las a seu gosto. Para persistir as alterações clique em Apply, ou Cancel para cancelar. 81

82 As alterações irão persistir mesmo se você fechar o navegador. BehaviorEditorPart Remova o ApperanceEditorPart e adicione um BehaviorEditorPart, clique no botão Edit e em seguida no comando edit de algum controle: 82

83 83

84 Veja que são muitas configurações de comportamento possíveis. Faça alguns testes, por exemplo, desmarque a opção Allow Close e verifique que a opção de fechar desaparece do controle. 84

85 9. Acesso a Dados Um das novidades no lançamento do primeira versão do Framework.NET, foi o ADO.NET, sucessor do ADO que até então era o modelo de acesso a dados da Microsoft. Surgiu com a promessa de ser um modelo desconectado para um mundo conectado: sua arquitetura era preparada para a Internet, onde as aplicações poderiam abrir uma conexão e recuperar dados, fechar a conexão, trabalhar desconectados e só voltar a abrir a conexão no momento de atualizar a fonte de dados. O ADO.NET cumpriu seu objetivo: Trouxe um modelo de acesso a dados poderoso e bastante flexível, otimizado para aplicações remotas. SQLDataSource e GridView O modelo de acesso a dados proposto pelo ADO.NET embora poderoso, é extramente complexo: para executar operações em uma fonte de dados o desenvolvedor teria que utilizar uma grande quantidade de classes como Connection, Transaction, Command, DataReader, DataAdapter, DataSet, DataTable etc. e entender como elas se interrelacionam. Na verdade isso não mudou desde a versão 1.1: A estrutura do ADO.NET é basicamente a mesma. Porém uma novidade a partir do.net 2.0 foram algumas classes denominados DataSource, entre eles o SQLDataSource. Estudamos no módulo II a classe SiteMapDataSource As classes DataSource é uma classe que nos permite acessar diversos bancos de dados relacionais ou não, e que internamente utiliza diversas objetos do ADO.NET, tornando o seu uso mais simples através de um único objeto. Por exemplo, para retornar um conjunto de dados de um servidor SQLServer, por exemplo, você precisar no mínimo de um SQLConnection, um SQLCommand e um SQLDataReader. Por outro lado você pode obter o mesmo conjunto de dados utilizando um único SQLDataSource, que internamente fará uso destes objetos. 85

86 Apesar do SQLDataSource fornecer um modelo simplificado e mais amigável, você deve conhecer os componentes do ADO.NET, pois a verdadeira funcionalidade de acesso a dados está nestas classes. ADO.NET será estudado mais adiante neste capitulo. Para demonstrar como é fácil e rápido criar uma aplicação que retorne uma tabela de um banco de dados em uma página ASP.NET, vamos demonstrar passo a passo a criação de uma aplicação utilizando o SQLDataSource. Uma tabela sem nenhum código Neste exemplo você verá que é possível retornar um conjunto de dados sem escrever sequer uma linha de código: Nestes exemplos estaremos utilizando o banco de dados AdventureWorks, que é o banco de dados de demonstração do SQL Server Você pode baixar este banco de dados do site oficial do SQL Server e instalá-lo, inclusive na versão Express. Se preferir você pode praticar com qualquer outro banco de dados, inclusive da versão Crie uma nova aplicação ASP.NET; Da barra de ferramentas Data, arraste um controle SQLDataSorce para o Web Form Default.aspx; Na Smart Tag do controle, clique em Configure DataSource; 86

87 É exibido um assistente de configuração. Na primeira etapa você deve informar com qual servidor deseja realizar a conexão. Para isto clique em New Connection, selecione Microsoft SQL Server em Data Source e.net FrameWork Data Provider for SQL Server em Data Provider, em seguida clique em continue. Em seguida é exibida a caixa de dialogo Add Connection, onde você deve informar as opções de conexão com os servidor: 87

88 De volta ao assistente, clique em Next; Neste passo você deve definr uma clausula Where e / ou OrderBy. Se você informar que deseja salvar a String de Conexão. Mantenha a opção marcada com o nome padrão para a string de conexão; No próximo passo você deve montar a consulta SQL. Informe uma tabela e as colunas que deseja incluir na consulta. Se incluir a chave primaria entre as colunas de seus Select, através da opção Advanced poderá ainda solicitar que sejam criados comandos SQL para inclusão, alteração e exclusão: 88

89 A próxima etapa permite que você teste a consulta SQL Criada. Clique em Finish. Se você examinar seu arquivo aspx poderá notas que o assistente configurou diversas propriedades do controle: 89

90 <asp:sqldatasource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>" DeleteCommand="DELETE FROM [Department] WHERE [DepartmentID] InsertCommand="INSERT INTO [Department] ([Name], [GroupName], [ModifiedDate]) SelectCommand="SELECT * FROM [Department]" UpdateCommand="UPDATE [Department] SET [Name] [GroupName] [ModifiedDate] WHERE [DepartmentID] <DeleteParameters> <asp:parameter Name="DepartmentID" Type="Int16" /> </DeleteParameters> <UpdateParameters> <asp:parameter Name="Name" Type="String" /> <asp:parameter Name="GroupName" Type="String" /> <asp:parameter Name="ModifiedDate" Type="DateTime" /> <asp:parameter Name="DepartmentID" Type="Int16" /> </UpdateParameters> <InsertParameters> <asp:parameter Name="Name" Type="String" /> <asp:parameter Name="GroupName" Type="String" /> <asp:parameter Name="ModifiedDate" Type="DateTime" /> </InsertParameters> </asp:sqldatasource> Além dos comandos de seleção, atualização, exclusão e inclusão, foram criados os parâmetros para a execução destas operações. Isto foi possível graças a inclusão da chave primária entre os campos a serem utilizados durante o assistente. Vamos agora exibir os dados na página: Adicione um GridView da barra de ferramentas data. Use a opção Auto Format da Smart Tag do controle para definir um layout para a tabela. O GridView será estudado melhor neste capitulo, por enquanto ele é um acessório para o estudo do SQLDataSource. Ainda na Smart Tag, selecione SQLDataSource1 na opção ChoseDataSource. Marque as opções Enable Paging. Enable Sorting, Enable Editing, Enable Deleting e Enable Selecion na Smart Tag: 90

91 Por fim, adicione a propriedade DataKeyNames, o(s) nome(s) do(s) campo(s) que compõe a chave primária da tabela. Rode a aplicação Parabéns! Você acabou de criar um software para exibir uma tabela em uma aplicação Web, onde é possível ordenar, paginar, alterar e excluir registros sem escrever nenhuma única linha de código!! 91

92 Obviamente se a operação de inclusão ou atualização violar alguma regra de integridade do banco de dados, será gerado um erro. As operações de atualização e exclusão só ocorrerão de forma correta desde que você tenha as instruções SQL respectivas configuradas de forma correta. Vamos ver agora algumas propriedades importantes do SQLDataSource: Cache O SQLDataSource possui embutido suporte a cache. Isto significa que após a execução de uma consulta, o conjunto de resultados será armazenados na memória do servidor. Na próxima consulta ao invés de recuperar as informações do banco de dados, o SQLDataSource irá recuperá-los do cache. Para habilitar cache no SQLDataSource, basta definir a propriedade EnableCache como True. A propriedade CacheDurantion deve conter o tempo, em segundos, que os dados serão mantidos em cache antes de nova consulta. DataSourceMode Esta propriedade indica como os dados serão carregados: Em um objeto DataSet ou um objeto DataReader. No modo DataSet o controle que estiver ligado ao SQLDataSource terá mais funcionalidades, como paginação e ordenação. No modo DataReader estas funcionalidades não estarão disponíveis, porém por se tratar de um cursor unidirecional e somente leitura, seu desempenho é superior. ConnectionString Através desta propriedade é definida a string de conexão, que contem as informações para conexão como sistema gerenciador de banco de dados. Executando uma consulta com parâmetros Você pode querer definir dinamicamente um valor para a clausula where de sua consulta. Para isto criamos um parâmetro e definimos um valor em tempo de execução. 92

93 O ASP.NET 2.0 prove funcionalidade para diversos tipos de parâmetros, como uma QueryString, um controle, um cookie, uma variável de sessão entre outros. Para exemplificar, vamos filtrar nossa consulta a partir de um valor da QueryString do formulário, para isso faremos uma pequena alteração na propriedade SelectQuery do SQLDataSource, adicionando uma clausula where e um parâmetro de nome DepartmentID do tipo QueryString: Ao rodar a aplicação passando um valor para a QueryString, nossa consulta é filtrada: 93

94 Neste segundo exemplo, vamos obter o valor para passar ao parâmetro através de um controle. Primeiramente adicionamos um controle textbox ao formulário, em seguida modificamos o mesmo parâmetro criado há pouco: 94

95 Coloque um button no formulário para causar um postback, preencha um valor no textbox e clique no button, mesmo sem código nenhum nos eventos de servidor o filtro deverá funcionar graças ao viewstate do textbox. Você pode utilizar parametros também para as operações de atualização, exclusão e inclusão. Mais GridView Na primeira versão do ASP.NET, um dos controles mais famoso foi o DataGrid. Com ele era possível exibir dados tabulares com pouco código. No ASP.NET 2.0 ele foi substituído pelo GridView, um controle ainda mais poderoso e que permite que muita coisa possa ser feita sem uma linha de código sequer. Na seção anterior estudamos rapidamente o GridView, vamos agora entende-lo melhor. Editando Colunas Você já viu como configurar um SQLDataSource. Faça isso e adicione um GridView a um Web Form. Na Smart Tag do GridView indique o SQLDataSource no item Choose Data Source. Isto também pode ser feito através da propriedade DataSourceID. Ainda na Smart Tag, selecione Edit Colums. É exibido o editor de colunas: 95

96 A área de edição de colunas é dividida em três partes. Na pequena área acima à esquerda temos a relação de campos disponíveis. BoundFields são campos oriundos de nossa fonte de dados, se você já ligou seu DataGridView ao SQLDataSource, os campos já devem aparecer disponíveis nesta sessão. Podemos ainda definir campos como CheckBoxField, HyperLinkField, ButtonField, ImageField, CommandField que podem ser Edit, Update, Cancel ou Select ou Delete, e TemplateField, onde podemos criar um campo Customizado. Em baixo a esquerda vemos os campos selecionados para exibição em nosso GridView, e a direita, podemos configurar as propriedades de cada campo. Você pode, por exemplo, criar uma mascara de formatação para exibir um valor de moeda, ou mesmo mudar o texto do cabeçalho do campo. Na tela acima, observe que é exibido entre os campos selecionados, um campo CommandField. Isto porque na Smart Tag do controle foram marcadas as opções de habilitar seleção, exclusão e edição. Podemos definir a aparência destes botões. 96

97 Por exemplo, se você quer que eles apareçam a direita do GridView e não a esquerda, basta move-los para baixo. A propriedade ButtonType permite os mesmos sejam exibidos como, por exemplo, botões ou imagens ao invés de links. Se você optar por imagem deve informar o caminho delas através da propriedade ImageUrl, formado pelo prefixo do nome do botão. Outra propriedade importante é definir o texto de cada botão. Vejam um exemplo de um GridView com alguma personalização: Se seu DataSource tiver um campo do tipo boleano, será incluido automaticamente entre as colunas disponíveis um CheckBoxFiled Não vamos estudar todas as propridades de cada tipo de campo. O importante é você saber onde encontra-las. Utilizando um DetailView Uma outra novidade a partir do ASP.NET 2.0 é o DetailView. Sua principal utilidade é exibir detalhes de um único registro, que normalmente são ocultados num GridView por 97

98 otimização de espaço. Você também pode utilizá-lo para incluir ou até mesmo excluir um registro. Para utilizá-lo basta adicionar ao Web Form e configurar suas principais propriedades através da smart tag, não esquecendo de informar a fonte de dados e de configurar as colunas. O ideal é que colunas que estejam marcadas como invisíveis no GridView, sejam visualizadas no DetailView. Para que o controle se mantenha atualizado, ou seja, exiba sempre os detalhes do registro selecionado no GridView, é preciso adicionar um segundo SQLDataSource, cujo comando de seleção tenha um parâmetro que aponte para campo chave do item selecionado no GridView. A tela abaixo exibe a construção de um parâmetro. Observe que é indicada a coluna, o operador, a origem (source) que é control, e em ControlID informamos o GridView que fornecerá o valor para o parâmetro. Abaixo você pode observar a aplicação em execução: 98

99 FormView Com certa semelhança com o DetailView, o FormView é formado por diversos templates com controles como labels e caixas de texto. È ideal para exibir dados na tela em forma de formulário. Também possui templates prontos e incluir um novo registro. Se seus SQLDataSource possui a instrução Insert, o FormView vai estar pronto para a inclusão de novos registros. No imagem abaixo podemos ver um FormView conectado a um SQLDataSource: 99

100 Abaixo você pode observar os templates que formam o FormsView. Cada um deles pode ser configurado de acordo com sua funcionalidade. Controles ListView e DataPager Os controles ListView e DataPager foram introduziados no ASP.NET.35. Desde o lançamento da primeira versão do ASP.NET a Microsoft incluiu em suas IDEs diversos controle de listagem de dados: DataGrid, GridView, Repeater entre outros. Embora sejam todos controles de listagem de dados, eles tem focos diferentes: o Repeater permite maior controle sobre o conteúdo renderizado, o DataList veio otimizado para exibição de dados em várias colunas etc. A evolução mesmo ficou por conta dos 100

101 controles multifuncionais, inicialmente o DataGrid na versão 1.X, o GridView surgindo na versão 2.0 trazendo novas características e agora, no ASP.NET 3.5, o ListView. O ListView é tudo de bom: Permite maior controle sobre o conteúdo gerado através de diversos eventos e templates, e, na minha opinião, o mais interessante: agora com um InsertItemTemplate. O que isto significa? As operações de insert para o DataGrid e para o GridView eram órfãs e tinham que ser tratadas a parte. Particularmente, com o GridView, eu colocava um Formview em modo de inserção no EmptyDataTemplate do GridView, e, ao clicar em um botão inserir normalmente colocado sobre o cabeçalho de uma coluna, desconectava o controle de seu datasource. O efeito era que a listagem de dados desaparecia dando lugar ao controle para inserção.agora finalmente posso ter todas as operações (Select, Insert, Update, Delete) em um mesmo controle! A inserção é por padrão feita próxima ao rodapé do Listview. ListView na prática Se você já usou algum ancestral do ListView não terá qualquer dificuldade em se familiarizar com este novo controle. Neste exemplo utilizo a boa e velha base de dados NorthWind, rodando em uma instancia do SQL Server 2005 Express. Vale lembrar que você pode baixar esta base de dados como um download independente a qualquer momento, através do site da Microsoft, ou utilize qualquer base de dados de sua preferência. Primeiramente abra o Visual Studio 2008, clique em New Web Site. Selecione.NET Framework 3.5 em na parte superior da janela, marque a opção ASP.NET Web Site e escolha a linguagem de sua preferência. 101

102 Abra a guia Data na caixa de ferramentas. Neste tutorial vamos trabalhar com três controles: ListView, DataPager e SqlDataSource. Observe na asp3imagem abaixo os controles circulados: Inicialmente jogue um controle ListView sobre o WebForm. 102

103 Na SmartTag do controle, clique em New data source, desta forma o Visual Studio vai criar um novo controle de acesso a dados. Poderíamos ter feito isto manualmente, arrastando um controle SqlDataSource para o WebForm. É exibido o DataSource Configuration Wizard. Na primeira etapa devemos informar a origem dos dados. Selecione Database e clique em Ok. Na próxima etapa devemos configurar a conexão: 103

104 Clique em New Connection e informe os dados de sua conexão, como no exemplo abaixo: De volta ao assistente, clique em Next. Nesta etapa você deve informar se deseja salvar a string de conexão no arquivo de configuração da aplicação (Web.config). Marque sim e clique em Next. Agora é o momento de informar a tabela ou a consulta que vai dar origem aos dados. No exemplo abaixo selecionei a tabela Employees com algumas colunas. 104

105 Antes de prosseguir, clique em Advanced e marque a opção Generate Insert, Update, and Delete statements para que o Visual Studio produza automaticamente as instruções Sql para que o ListVew possa incluir, atualizar e excluir dados automaticamente. Importante observar que para esta opção estar habilitada é fundamental que entre as colunas selecionadas estejam aquelas que compõem a chave primária da tabela. No exemplo acima trata-se da coluna EmployeeID. Clique em Next, nesta última opção do assistente você pode testar a consulta gerada. Clique em Finish. Se observarmos o código gerado para o ListView até o momento é demasiadamente simples, pois ainda não definimos nenhuma propriedade além de DataSourceID: 105

106 <asp:listview ID="ListView1" runat="server" DataSourceID="SqlDataSource1"> </asp:listview> Vamos tratar de configurar o ListView. Voltando a área de design, na Smart tag do ListView clique em configure ListView: Nesta janela podemos configurar as funcionalidade principais do ListView. Primeiramente um Layout, teste todas as opções e veja o comportamento na janela Preview. Abaixo você pode selecionar um estilo. Em opções devemos informar se o ListView vai ter habilitadas funções de edição, inserção, exclusão e paginação. Para este exemplo deixa marcado todas as opções, com exceção de paginação: Clique em ok e rode a aplicação. Observe que temos agora uma listagem de dados 100% funcional. Observe que a linha de inserção é incluída no junto ao rodapé da listagem: 106

107 DataPager Assim como seus ancestrais, o ListView tem paginação nativa embutida. Porém agora temos um controle de paginação à parte: O DataPager. Curioso é que o DataPager funciona apenas com o ListView. Você deve estar se perguntando: Então porque usá-lo ao invés da paginação embutida no ListView? Como um controle separado temos mais poder sobre como queremos nossa paginação. Também devemos lembrar que o DataPager não foi concebido para funcionar exclusivamente com o ListView, mas com qualquer controle que implemente a interface IPageableItemContainer. No ambiente do ASP.NET 3.5 este é o único controle nativo que implementa tal interface. Mãos a obra. Arraste um controle DataPager para o Web Form. Na janela de propriedades do controle, defina PagedControlId para ListView1 e PageSize para 5, pois a tabela que escolhi para o exemplo possui menos que 10 registros: Na Smart Tag do DataPager, defina um estilo de paginação, que pode ser com botões do tipo próximo/anterior ou mesmo numérica. Para o exemplo escolhi Próximo/anterior: 107

108 Neste momento, ao rodar a aplicação, já temos nosso ListView com as funcionalidades de paginação em funcionamento: Ado.net Como dissemos no inicio do capitulo, o ADO.NET é foi criado para ser um modelo de dados desconectado, pronto para Web. È formando por uma série de objetos, alguns independentes de fonte de dados, outros não. Um objeto independe de fonte pode abrigar ao mesmo tempo dados de origens diversas, como por exemplo, uma tabela de um banco de dados Oracle e outra de um arquivo Access. O Objeto de conexão para o SQLSever é o SQLConnection. Havendo uma conexão os dados podem ser recuperados para um SQLDatareader, SQLCommand ou mesmo um DataSet. O SQLCommand permite executar um comando SQL contra uma fonte de dados. Pode trabalhar apenas com um SQLConnection ou em conjunto com outras classes ADO.NET. Um SQLDataReader é um cursor unidirecional e somente leitura. É ótimo para leitura de dados ou geração de relatórios, pois é veloz. Porém não permite qualquer alteração nos dados, além de monopolizar a conexão com o banco de dados enquanto esta operando. 108

109 Um DataSet é um pequeno banco de dados em memória. Você não precisa de uma conexão permanente com o banco de dados enquanto estiver utilizando os dados. Você pode abrir a conexão, recuperar os dados, executar alterações, exclusões ou inclusões, abrir novamente a conexão e atualizar a fonte de dados. Dentro de uma DataSet podemos ter uma ou mais DataTables, que são tabelas, que podem ter origens de fontes de dados independentes. Podemos ainda ter DataRelations, que representam relações entre tabelas. Uma DataTable é formado por DataRows, que representam colunas. Outra classe importante é DataView, que é exatamente o que parece: Uma visão de dados. Um DataTable possui um DataView padrão, outros podem ser criados. Todos os objetos descritos neste parágrafo são independentes da fonte dos dados, pois são armazenados em memória no formato XML. Agora como transformar dados de uma fonte especifica em um DataSet? Esta tarefa é do SQLDataAdapter, que faz a transformação dos dados entre a sua origem, através da conexão, até o DataSet e vice-versa. O SQLDataAdapter devolve a conexão no estado que a encontrou: Se estava aberta, mantém aberta. Se estava fechado, abre, executa a operação e fecha a conexão. 109

110 Vamos ver as principais classes do ADO.NET SQLConnection O SQLConnection representa uma conexão com um banco de dados SQLServer. Suas principais propriedades são ConnectionString, que é a string com os parâmetros de conexão com o servidor. Entre os métodos temos Open, que abre a conexão, e close, que fecha a mesma. A propriedade State retorna o estado atual da conexão. Vejamos o exemplo abaixo: Embora existam provedores para acessar as mais variadas fontes de dados, iremos demostrar as funcionalidades do ADO.NET com classes de acesso ao SQLServer. A funcionalidade das demais classes é bem semelhante. Para utilizar as classes ADO.NET para SQL Server, você deve importar o namespace system.data.sqlclient. Para as classes independentes de fonte de dados, como o DataSet, o namespace é sytem.data 110

111 Dim Conexao As New SqlConnection Conexao.ConnectionString = "Data Source=LOCALHOST\SQLEXPRESS;" & _ "Initial Catalog=AdventureWorks;Integrated Security=True" Conexao.Open() 'Executa algum código Conexao.Close() SqlConnection Conexao = new SqlConnection(); Conexao.ConnectionString = "Data Source=LOCALHOST'\'SQLEXPRESS;" + "Initial Catalog=AdventureWorks;Integrated Security=True"; Conexao.Open(); //Executa algum código Conexao.Close(); Ao abrir uma conexão mil coisas podem dar errado: O servidor não estar disponível, a string de conexão esta errada, o usuário não ter permissão de acesso...só para citar algumas. Por este motivo a abertura da conexão acima deveria ser protegida em um bloco try...except. Isto foi omitido para fins de clareza do código...no mundo real, é uma prática que deve ser considerada. SQLCommand A classe SQLCommand permite que sejam executados quaisquer comando SQL. Para ser executado com sucesso precisa de uma instrução SQL ou de um nome de tabela ou procedure, a ser informada na propriedade CommandText e uma conexão informada através da propriedade Connection, que deve ser um objeto SQLConnection. A execução do comando pode ser feito através de quatro métodos distintos: ExecuteNonQuery: Ideal para execução de instruções que não retornam um conjunto de dados. Retorna um valor inteiro informando o número de linhas afetadas; ExecuteReader: Para utilização com um SQLDataReader, a ser estudado na próxima sessão; ExecuteScalar: Retorna apenas a primeira coluna da primeira linha, o restante dos valores são ignorados. Ideal para sumarização de valores. O exemplo abaixo retorna o total de registros de uma tabela e exibe em um textbox, para funcionar perfeitamente basta encaixá-lo no comentário do exemplo anterior, de demonstração da conexão: 111

112 Dim comando As New SqlCommand comando.connection = Conexao comando.commandtext = "SELECT COUNT(*) FROM Sales.Currency" Dim a As Integer = comando.executescalar TextBox1.Text = Convert.ToString(a) SqlCommand comando = new SqlCommand(); comando.connection = Conexao; comando.commandtext = "SELECT COUNT(*) FROM Sales.Currency"; int a = Convert.ToInt32(comando.ExecuteScalar()); TextBox1.Text = Convert.ToString(a); SQLDataReader Como dito o SQLDataReader é um cursor unidirecional e somente leitura, porém muito veloz. Você pode ligar seu resultado diretamente a um controle: Dim comando As New SqlCommand comando.connection = Conexao comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency" Dim reader As SqlDataReader = comando.executereader GridView1.DataSource = reader GridView1.DataBind() SqlCommand comando = new SqlCommand(); comando.connection = Conexao; comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency"; SqlDataReader reader = comando.executereader(); GridView1.DataSource = reader; GridView1.DataBind(); Neste outro exemplo, ele é ligado a um DropDownList. Note que nome da moeda é ligado a propriedade TextField, enquanto o código a propriedade Valuefield, desta forma será exibida a nome da moeda para o usuário, mas programaticamente poderemos facilmente recuperar o código da moeda selecionada: Dim comando As New SqlCommand comando.connection = Conexao comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency" Dim reader As SqlDataReader = comando.executereader DropDownList1.DataSource = reader DropDownList1.DataValueField = "CurrencyCode" DropDownList1.DataTextField = "Name" DropDownList1.DataBind() 112

113 SqlCommand comando = new SqlCommand(); comando.connection = Conexao; comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency"; SqlDataReader reader = comando.executereader(); DropDownList1.DataSource = reader; DropDownList1.DataValueField = "CurrencyCode"; DropDownList1.DataTextField = "Name"; DropDownList1.DataBind(); No próximo exemplo, temos apenas uma pequena alteração: È passado um argumento a sobrecarga do construtor do ExecuteReader: CommandBehavior, que é um enumerador que vai determinar o comportamento do SQLDataReader. Neste exemplo, CommandBehavior.CloseConnection fecha a conexão com o banco de dados após a utlização: Dim comando As New SqlCommand comando.connection = Conexao comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency" Dim reader As SqlDataReader = comando.executereader(commandbehavior.closeconnection) DropDownList1.DataSource = reader DropDownList1.DataValueField = "CurrencyCode" DropDownList1.DataTextField = "Name" DropDownList1.DataBind() SqlCommand comando = new SqlCommand(); comando.connection = Conexao; comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency"; SqlDataReader reader = comando.executereader(commandbehavior.closeconnection); DropDownList1.DataSource = reader; DropDownList1.DataValueField = "CurrencyCode"; DropDownList1.DataTextField = "Name"; DropDownList1.DataBind(); Finalmente, para percorrer os itens de um SQLDataReader, podemos utilizar o método Read, que retorna verdadeiro e avança um registro, enquanto houverem linhas disponíveis. Neste exemplo as linhas são adicionadas a um ListBox: Dim comando As New SqlCommand comando.connection = Conexao comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency" Dim reader As SqlDataReader = comando.executereader(commandbehavior.closeconnection) While reader.read ListBox1.Items.Add(reader.Item("Name")) End While 113

114 SqlCommand comando = new SqlCommand(); comando.connection = Conexao; comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency"; SqlDataReader reader = comando.executereader(commandbehavior.closeconnection); while (reader.read()) { ListBox1.Items.Add(Convert.ToString(reader["Name"])); } Parâmetros A utilização dos classes de parametros do ADO.NET são um ponto importante no quesito segurança, pois eliminam o risco de injeção de SQL A classe parâmetros permite que sejam criados parâmetros para a execução de instruções sql. Na instrução o parâmetro deve ser identificado mais um identificador único. O objeto parâmetro deverá ter o mesmo nome o qual vai passar o valor. Vejamos o exemplo abaixo: Dim comando As New SqlCommand comando.connection = Conexao comando.commandtext = "SELECT * FROM Person.Contact " & _ " where ContactID Dim parametro As New SqlParameter("@ContactID", SqlDbType.Int) parametro.value = Convert.ToInt32("1") comando.parameters.add(parametro) Dim reader As SqlDataReader = comando.executereader(commandbehavior.closeconnection) GridView1.DataSource = reader GridView1.DataBind() SqlCommand comando = new SqlCommand(); comando.connection = Conexao; comando.commandtext = "SELECT CurrencyCode,Name FROM Sales.Currency"; SqlParameter parametro = new SqlParameter("@ContactID", SqlDbType.Int); parametro.value = Convert.ToInt32("1"); comando.parameters.add(parametro); SqlDataReader reader = comando.executereader(commandbehavior.closeconnection); GridView1.DataSource = reader; GridView1.DataBind(); Primeiro instanciamos o objeto SQLParameter utilizando um de seus construtores. Existem sete sobrecargas. No exemplo, é passado o nome do parâmetro e o tipo. Em 114

115 seguida atribuímos um valor ao parâmetro, e finalmente o adicionamos a coleção de parâmetros do comando. O objeto parametro não precisa ter o mesmo nome do campo da tabela Se você estiver usando outro provider, como o OleDb, os parametros devem ser identificados por?. Os valores devem ser fornecidos na ordem em que eles estão no SQL, pois não há como nomealos SQLDataAdapter, DataSet e DataTable A unica função do SQLDataAdapter é fazer a ligação entre a fonte de dados e o DataSet. Um DataAdapter, assim como um SQLDataSource, pode receber até quatro instruções SQL: Para consulta, inclusão, exlcusão e alteração. Existem quatro sobrecargas do contrutor de um DataAdapter. Se você não quizer instanciar objetos connection e command, pode utilizar uma sobrecarga que recebe o comando sql de seleção e a string de conexão, que estes objetos são criados implicitamente. O preenchimento de um DataSet por um DataAdapter é feito através do método fill: Dim Adp As New SqlDataAdapter("SELECT * FROM Person.Contact ",_ Conexao) Dim Ds As New DataSet Adp.Fill(Ds) GridView1.DataSource = Ds GridView1.DataBind() SqlDataAdapter Adp = new SqlDataAdapter ("SELECT * FROM Person.Contact ", Conexao); DataSet Ds = new DataSet(); Adp.Fill(Ds); GridView1.DataSource = Ds; GridView1.DataBind(); A atualização dos dados é feita através do método update. Apenas quando o método é executado que qualquer alteração nos dados serão replicados ao banco de dados, pois, lembrando, o DataSet trabalha desconectado. 115

116 Outro aspecto importante é que o para fazer uma atualização, seja exclusão, inclusão ou alteração, o Adapter precisa obter os comando SQL para tais operações. Através da classe CommadBuilder podemos gerar automaticamente estas instruções para o SQLDataAdapter. No exemplo abaixo, o campo FirstName da tabela Person.Contact é alterado para Gustavo II: Dim Adp As New SqlDataAdapter("SELECT * FROM Person.Contact ",_ Conexao) Dim CmdBuilder As New SqlCommandBuilder(Adp) Dim Ds As New DataSet Ds.Tables(0).Rows(0).Item("FirstName") = "Gustavo II" Adp.Update(Ds) SqlDataAdapter Adp = new SqlDataAdapter ("SELECT * FROM Person.Contact ", Conexao); SqlCommandBuilder CmdBuilder = new SqlCommandBuilder; DataSet Ds = new DataSet(); Ds.Tables[0].Rows[0]["FistName"] = "Gustavo II"; Adp.Update(Ds); Como o DataSet é um pequeno banco de dados em memória, podemos adicionar varias tabelas ao mesmo, inclusive de fontes diferentes. No exemplo a seguir dois objetos DataTable são preenchidos e depois adicionados a um mesmo DataSet. Dim Adp1 As New SqlDataAdapter("SELECT * FROM Person.Contact ",_ Conexao) Dim Dt1 As New DataTable Adp1.Fill(Dt1) Dim Adp2 As New SqlDataAdapter("SELECT * FROM Person.ContactType ",_ Conexao) Dim Dt2 As New DataTable Adp2.Fill(Dt2) Dim Ds As New DataSet Ds.Tables.Add(Dt1) Ds.Tables.Add(Dt2) SqlDataAdapter Adp1 = new SqlDataAdapter ("SELECT * FROM Person.Contact ", Conexao); DataTable Dt1 = new DataTable(); Adp1.Fill(Dt1); SqlDataAdapter Adp2 = new SqlDataAdapter ("SELECT * FROM Person.ContactType ", Conexao); DataTable Dt2 = new DataTable(); Adp2.Fill(Dt2); 116

117 DataSet Ds = new DataSet(); Ds.Tables.Add(Dt1); Ds.Tables.Add(Dt2); Finalmente, neste último exemplo adicionamos uma linha a uma tabela. Primeiramente preechemos a tabela através de um DataAdapter. Em seguida instanciamos um objeto DataRow a partir da tabela, ou seja, com sua definição de dados, preenchemos os valores dos campos, adicionamos a coleção de dados do DataTable invocamos o método Update do Adapter para atualizar a fonte de dados: e finalmente Dim Adp As New SqlDataAdapter("SELECT * FROM Sales.Currency ", Conexao) Dim CmdBuilder As New SqlCommandBuilder(Adp) Dim Dt As New DataTable Adp.Fill(Dt) Dim Dr As DataRow = Dt.NewRow Dr("CurrencyCode") = "BRU" Dr("Name") = "Brazilian UNReal" Dr("ModifiedDate") = "01/01/2006" Dt.Rows.Add(Dr) Adp.Update(Dt) SqlDataAdapter Adp = new SqlDataAdapter ("SELECT * FROM Sales.Currency ", Conexao); SqlCommandBuilder CmdBuilder = new SqlCommandBuilder(Adp); DataTable Dt = new DataTable(); Adp.Fill(Dt); DataRow Dr = Dt.NewRow(); Dr["CurrencyCode"] = "BRU"; Dr["Name"] = "Brazilian UNReal"; Dr["ModifiedDate"] = "01/01/2006"; Dt.Rows.Add(Dr); Adp.Update(Dt); Observe que neste último exemplo sequer utlizamos um DataSet! SQLTransaction O ADO.NET também possui classes que dão suporte a controle de transações. Devemos declarar uma transação e iniciá-la pelo objeto de conexão e ainda atribuí-la aos objetos que farão parte da operação. Para confirmar as operações chamamos o método commit do objeto Transaction, para desfazer o método é rollback. 117

118 No exemplo abaixo, adaptado de exemplo anterior, é criado um objeto SQLTransaction e atribuído a propriedade Transaction do comando insert do DataDdapter, que é o comando utilizado para inserir um novo registro. O método update do DataAdapter, que é o método que de fato atualiza a base de dados, é chamado em um bloco protegido try..cacth. Se tudo der certo a transação é confirmada. Caso algo de errado a transação é desfeita. Dim Trans As SqlTransaction = conexao.begintransaction Dim Adp As New SqlDataAdapter("SELECT * FROM Sales.Currency ",_ Conexao) Adp.InsertCommand.Transaction = Trans Dim CmdBuilder As New SqlCommandBuilder(Adp) Dim Dt As New DataTable Adp.Fill(Dt) Dim Dr As DataRow = Dt.NewRow Dr("CurrencyCode") = "BRU" Dr("Name") = "Brazilian UNReal" Dr("ModifiedDate") = "01/01/2006" Dt.Rows.Add(Dr) Try Adp.Update(Dt) Trans.Commit() Catch ex As Exception Trans.Rollback() End Try SqlTransaction Trans = Conexao.BeginTransaction(); SqlDataAdapter Adp = new SqlDataAdapter( "SELECT * FROM Sales.Currency ", Conexao); Adp.InsertCommand.Transaction = Trans; SqlCommandBuilder CmdBuilder = new SqlCommandBuilder(Adp); DataTable Dt = new DataTable(); Adp.Fill(Dt); DataRow Dr = Dt.NewRow(); Dr["CurrencyCode"] = "BRU"; Dr["Name"] = "Brazilian UNReal"; Dr["ModifiedDate"] = "01/01/2006"; Dt.Rows.Add(Dr); try { Adp.Update(Dt); Trans.Commit(); } catch (Exception s) { Trans.Rollback(); } 118

119 10. LINQ Como falamos nas seções iniciais deste curso, o LINQ, uma promessa antiga da Microsoft, veio para preencher o vazio existente entre a orientação a objetos e os bancos de dados relacionais. Na verdade o LINQ foi um pouco além disso, se tornando uma linguagem padrão de manipulação de dados em diversos formatos. Existem três forma de LINQ: LINQ para Objetos, LINQ para XML e LINQ para SQL. Vamos agora fazer uma breve introdução ao LINQ para SQL. Crie uma nova aplicação ASP.NET 3.5, na caixa de dialogo Add New Item selecione LINQ to SQL Classes, de o nome da base de dados que irá utilizar, no meu Caso, NorthWind: O VS sugere que o arquivo será criado na pasta App_code, clique em Sim. Abra o Server Explorer, conecte com o banco de dados que irá utilizar, expanda a pasta Tables: 119

120 Arraste as tabelas que deseja utilizar para a área especifica do arquivo dbml. No exemplo arrastei a entidade Customers e Orders. Note que o VS mapeou a tabela em duas classes, inclusive alterando o nome para Customer e Order. O VS também indiciou o relacionamento entre as classes: 120

121 Agora vá para o WebForm criado na sua aplicação. Na área de design coloco que controle GridView, de um duplo clique sobre o formulário para criar um manipular para o envento OnLoad do WebForm. Digite o seguinte código: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim db As New NorthwindDataContext Dim consulta = From n In db.customers Select n GridView1.DataSource = consulta GridView1.DataBind() End Sub public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { NorthwindDataContext db = new NorthwindDataContext(); var consulta = from n in db.customers select n; GridView1.DataSource = consulta; GridView1.DataBind(); } } Rode a aplicação e observe o resultado. 121

122 11. MemberShip e Roles No ASP Clássico e em outras linguagem para web você tinha que fazer todo o trabalho de gerenciamento de usuários e grupos: Criar usuários, paginas de logins, trocas de senhas, recuperação de senhas, autenticação, criação de grupos de usuários, gerenciamento de grupos além de toda a estrutura de armazenamento necessária para isto tudo. Você também tinha que programar toda a parte de autorização de seu aplicativo: normalmente cada grupo de usuários estava restrito a um determinado numero de ações que poderiam ser executadas e ou paginas a qual ele poderia acessar. Na primeira versão do ASP.NET muita coisa mudou, a programação de tudo isso citado no parágrafo anterior ficou um pouco mais fácil, mas ainda era preciso muito trabalho manual. A partir do ASP.NET 2.0, um novo recurso denominado MemberShip, veio para tornar tudo isso muito mais fácil. Mais do que isso, para revolucionar o gerenciamento de usuário, grupos e permissões. Além de uma série de controles prontos para gerenciamento de usuários e autenticação, o ASP.NET pode agora cuidar do armazenamento de tudo isso automaticamente através de um banco de dados do SQLExpress ou em qualquer outra fonte de dados que você quiser, inclusive o Active Directory. Definindo um Site para utilizar Forms Autentication Uma aplicação Web pode ser totalmente publica, com um porta de noticias, ou pode requerer autenticação, como um InternetBanking, ou ainda pode ser um misto de ambos: Um site de comércio eletrônico onde você navega e compra de forma anônima e se autentica na hora do pagamento. A autenticação em uma aplicação Web pode se dar de varias formas: Integrada com o Active Directory, onde poderão ser utilizadas as credencias que o usuário logou no diretório, Passport, que é um serviço pago mantido pela Microsoft e que já teve seu fim decretado, ou Forms, em que o usuário é autenticado através de informações digitadas em um formulário. 122

123 A forma de autenticação na mais comum na internet é Forms. Windows é util por exemplo, em uma aplicação de Intranet, em que podemos aproveitar as credencias do usuário no Diretório. Sugiro que você acompanhe os exemplos passa a passo, já que uma etapa é diretamente dependente da outra. Ao criar uma nova aplicação ASP.NET, por padrão ele não terá qualquer tipo de autenticação e seus acesso será irrestrito. Para conhecermos os conceitos crie uma aplicação com cinco WebForms: Administracao.aspx, Default.aspx, Login.aspx, NovoUsuario.aspx e TrocarSenha.aspx. Observe a aplicação na imagem abaixo: Rode a aplicação e note que você pode navegar livremente entre os formulários. Preparando o Arquivo web.config 123

124 Para definir autenticação Forms devemos fazer algumas alterações no arquivo web.config como no exemplo abaixo: Você pode fazer as alterações necessárias no web.config através da ferramenta ASP.NET Configuration, que pode ser acionada através do ícone no Solution Explorer. <authentication mode="forms"> <forms name=".aspxauth" loginurl="login.aspx" defaulturl="default.aspx"> </forms> </authentication> Você esta informando ao ASP.NET que vai utilizar autenticação do tipo Forms, que o nome do cookie de autenticação utilizado será.aspxauth (padrão), que o formulário de autenticação será login.aspx e que o formulário padrão será default. Outras configurações podem ser adicionadas a este nó, estas exibidas são as mais relevantes. Se você rodar a aplicação agora perceberá que ainda poderá navegar livremente entre as páginas. O que deu errado? Embora você tenha definido um método de autenticação, você ainda não restringiu o acesso de usuários anonimos a aplicação. Isso deve ser feito com a adição de uma de um nó autorization, onde negamos acesso a usuários desconhecidos (não autenticados) representado pelo? : <authorization> <deny users="?" /> </authorization> Ao final deste capitulo, apresento o web.config completo, da maneira que o seu deverá estar após todos os exemplos. Utilize-o para localizar onde determinada configuração deve se encaixar. Não copie o arquivo inteiro. Agora defina a página clientes como página inicial e rode a aplicação. Você deve observar duas coisas: Você foi redirecionado para a página login.aspx, pois é a página definida para autenticação em nosso arquivo de configuração. 124

125 Na URL, o ASP.NET adicionou a página inicial solicitada, de forma que você possa ser redirecionado automaticamente após a autenticação Agora estamos prontos para autenticar o usuário. Porém antes de autenticá-los precisamos criá-los, é o que vamos ver a seguir. Criando novos usuários com o controle CreateUserWizard Criamos uma página para criação de usuários, NovoUsuario.aspx. Em aplicações este tipo de pagina normalmente tem seu acesso irrestrito, ou seja, usuários anônimos podem entrar livremente e se cadastrarem. Porém como definimos autenticação por formulários, nenhum usuário conseguirá acessá-las sem estar autenticado. Temos que torná-la publica, ou seja, de acesso anônimo. Precisar definir algumas paginas, ou diretórios inteiros, com acesso anônimo e outras não é algo comum, portanto é algo que você vai usar com freqüência em suas futuras aplicações. Para definirmos uma determinada página como publica basta adicionarmos um nó location após o nó </system.web> já existente em nosso web.config, da seguinte forma: <location path="novousuario.aspx"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location> Estamos definindo que a página NovoUsuario.aspx é de acesso anonimo. Defina NovoUsuario.aspx como página inicial e rode a aplicação. Note que você consegue 125

126 acessa-la normalmente, embora o restante da aplicação ainda lhe redirecione para o Login. Agora basta acionar um controle CreateUserWizard a nossa página de criação de usuários. Note que este controle possui dezenas de propriedades que permitem sua personalização, inclusive a troca das mensagens e labels. Não vamos entrar em detalhes porque é quase tudo bem intuitivo, basta explorar o controle por alguns minutos. Rode novamente a aplicação e crie um novo usuário, preenchendo todos os campos obrigatórios, como na imagem abaixo: Por padrão, a senha deve conter no mínimo 7 caracteres, sendo no mínimo um caractere não alfanumérico ( # por exemplo). O ASP.NET informa que a criação do usuário ocorreu com sucesso. 126

127 Antes de continuarmos, vamos entender o que o ASP.NET fez internamente. Primeiramente abra ao Solution Explorer, clique com o botão direito em cima da aplicação e clique em Refresh. Expanda o nó data. Note que foi criado um banco de dados SQL Server Express (mdb). De um duplo clique sobre o banco para abri-lo no Server Explorer. Note que foi criada toda a estrutura de tabelas necessárias para o gerenciamento de usuários, grupos e permissões: 127

128 Se você examinar a tabela aspnet_user, verá que o usuário criado esta armazenado nesta. Autenticando usuários com Login Criado nosso usuário, agora podemos autenticá-lo. Para isso vamos utilizar o controle Login, encontrado também na barra de ferramentas de mesmo nome. Coloque um controle na pagina Login.aspx, defina a pagina default.aspx com pagina inicial e rode a aplicação. 128

129 Se você informou o usuário e senha corretamente será redirecionado para a página Default e terá livre acesso a todas as demais páginas da aplicação. Trocando a senha com ChangePassword Outra funcionalidade pronta e encapsulada em um controle é o ChangePassword. Para utilizá-lo adicione o mesmo a pagina TrocarSenha.aspx, defina esta como pagina inicial e rode a aplicação, após o login você é redirecionado para uma troca de senha, onde você deve informar a senha atual, a nova senha e a confirmação da nova senha: Uma mensagem informa que a senha foi troca com sucesso: 129

130 Criando um atalho para Login ou Logout com LoginStatus O controle LoginStatus permite criar um atalho para efetuar um login ou Logout do usuário. O controle possui duas visualização: Logged Out, que deve ser definida em situações em que o usuário não se encontra autenticado, e Logged In, quando o usuário já se autenticou no sistema, como você pode ver na imagem abaixo: Normalmente você vai colocá-lo na visualização Logged Out em áreas publicas e como Logged In em áreas autenticadas. Vamos testá-lo das duas formas. Definimos anteriormente a pagina NovoUsuario.aspx como publica, portanto a mesma poderá ser acessada sem autenticação. Coloque um controle LoginStatus nesta pagina com a visão Logged out, defina esta pagina como página inicial e rode a aplicação: 130

131 Ao clicar em Login o usuário é redirecionado para a página de login da aplicação. Agora vamos testá-lo na visão Logged In. Coloque um controle LogginStatus na página default.aspx, defina sua visão como Logged In e defina esta página como inicial. Ao rodar a aplicação você é direcionado para o Login, pois default.aspx não permite acesso anônimo. Após a autenticação você é redirecionado para a página default, onde o controle pode ser visualizado: 131

132 Clicando sobre o controle seu cookie de autenticação é excluído, e você passa a ser um usuário não autenticado, portanto a aplicação o redireciona para a página de login. Informando o usuário autenticado com LoginName O controle LoginName permite que seja exibido em qualquer local o nome do usuário autenticado. Basta colocá-lo sobre a página. Abaixo você pode ver o mesmo sobre a página default.aspx, acessada obviamente após a autenticação: Para personalizar a mensagem você pode utilizar a propriedade FormatString, que por padrão esta preenchida como {0}. Para exibir uma mensagem como Usuário Logado: Fernando basta alterar a propriedade da seguinte forma: 132

133 Observe o resultado em tempo de execução: Se você colocá-lo em uma página publica e acessá-la sem autenticação, nada será exibido. Recuperando senhas com PasswordRecovery O controle PasswordRecovery permite recuperar senhas esquecidas. Para utilizá-lo basta colocar o controle sobre a pagina. O usuário terá que informar o nome de usuário e responder a pergunta cadastrada durante a criação do usuário. A senha será enviada para o também cadastrado durante a criação do usuário. 133

134 Para testar o controle primeiro você precisa informar um servidor smtp em seu arquivo web.config, a fim de enviar o , para isso adicione o seguinte nó, logo após o nó location criado anteriormente: <system.net> <mailsettings> <smtp from="fulano@portal.com"> <network host="smtp.portal.com" port="25" username="user" password="123" /> </smtp> </mailsettings> </system.net> Obviamente as informações acima são fictícias, você deve colocar informações de um servidor smtp válido. O próximo passo é colocar um controle PasswordRecovery em sua página de login.aspx, que é local mais apropriado por ser onde normalmente o usuário descobre que esqueceu a senha e também por ter acesso publico: Defina login.aspx como página inicial e rode a aplicação. Para recuperar a senha, primeiramente você vai ter que informar o nome do usuário: 134

135 Em seguida, deve responder a pergunta secreta cadastrada durante o login: 135

136 Se tudo correr bem, a aplicação informa que o foi enviado: 136

137 Ok, agora é só abrir o . Você vai receber uma mensagem semelhante a listada abaixo: Please return to the site and log in using the following information. User Name: Fernando Password: rnairyqsblab s Bom, temos um problema. A senha retornada não é nem parecida com a que você cadastrou. o que deu errado? O motivo é simples: É uma boa prática armazenar senhas no forma de Hashs. Um hash é um conjunto de caracteres obtidos através da aplicação de um algoritmo de criptografia sobre alguma informação. Um hash tem algumas características peculiares: Tem tamanho fixo, ou seja, se você aplicar um hash sobre a bíblia ou sobre o seu nome, o tamanho do hash deverá ser o mesmo. 137

138 Deve ser único, ou seja, nenhum hash gerado a partir de uma informação diferente deve ser igual a outro qualquer. É irreversível. Ao contrário da criptografia simétrica em que podem embaralhar alguns dados e fazer o caminho inverso, com um hash não podemos obter a informação original. O uso de hash é ideal para o armazenamento se senhas. No login, o sistema gera um hash a partir da senha informada e compara com o valor armazenado. A grande vantagem é que a senha original não precisa ser armazenada, corremos menos riscos. A desvantagem é que se o usuário esquecer a senha, a única saída é criar outra. Foi o que ASP.NET fez, gerou uma nova senha e enviou para o do usuário. Opcionalmente você pode alterar este comportamento, para que as senhas sejam armazenadas Criptografadas ou sem qualquer mecanismo de criptografia, porém é recomendável manter o comportamento padrão do ASP.NET. Conteudos para usuários anonimos e autenticados em uma mesma página É comum também quereremos exibir para nossos usuários conteudos especificos conforme sua situação na Site. Por exemplo, em uma determinada parte da página, se o usuário esta logado exibimos seu nome de usuário, se não estiver logado, colocamos uma caixa de login. O controle LoginView tem exatamente este objetivo. Ele é formado de dois templates: Anonymous e LoggedIn. Para testa-lo abra a pagina NovoUsuario.aspx e coloque um LoginView, no template Anonymous coloque um controle Login, e no template LoggedIn coloque um controle LoginName Login. Defina a página NovoUsuario.aspx como inicial e rode a aplicação. Note que é exibido o conteudo do template Anonymous, pois o usuário ainda não efetuou login: 138

139 Agora defina Login.aspx como página inicial, efetue o login e redirecione para NovoUsuario.aspx (digite a URL no navegador). Note que agora é exibido o conteudo do template LoggedIn: 139

140 Gerenciado usuários manualmente O ASP.NET prove ainda uma API com diversas classes que nos permitem fazer tudo o que foi estudado até o momento manualmente (e muito mais). Para exemplificar, vamos listar na página Default.aspx todos os usuário do sistema em um ListBox através do método GetAllUser. Para isso, adicione um Listbox a sua pagina e no evento Load da página escreva o seguinte código: If Not Page.IsPostBack Then ListBox1.DataSource = Membership.GetAllUsers ListBox1.DataBind() End If 140

141 if (!Page.IsPostBack) { ListBox1.DataSource = Membership.GetAllUsers(); ListBox1.DataBind(); } Listar todas as classes com seus métodos e exemplos requer um curso inteiro, por isso vou listar abaixo as principais classes e seus membros mais importantes, com suas respectivas funções: Classe MemberShip Funções especificas de gerenciamento de usuários. CreateUser: Permite Criar um novo usuário. DeleteUser: Permite excluir um usuário. FindUserBy Retorna uma coleção de usuários com o especificado. GeneratePassword: Gera uma senha aleatória. GetAllUsers: Retorna uma coleção de usuários. GetUserNameBy Retorna um usuário cujo equivale ao especificado. UpdateUser: Atualiza o usuário. ValidateUser: Verifica se o usuário e sua senha são válidos. 141

142 Classe MemberShipUser Trás informações especificas de um usuário CreationDate: Data e hora em que o usuário foi criado. Retorna ou determina o do usuário. IsOnLine: Retorna se o usuário esta on-line. LastActivityDate: Retorna a data e hora da última atividade do usuário LastLoginDate: Retorna a data do ultimo login do usuário. Autorização e Funções Até agora vimos alguns métodos de gerenciamento de usuários. Porém normalmente usuários têm funções diferentes em um negócio, e sua aplicação deverá ser capaz de gerenciar isto. Embora neste quesito já não existam controles prontos, o gerenciamento de funções é também muito mais fácil e rápido no ASP.NET 3.5. Para testarmos o gerenciamento e uso de funções vamos executar as seguintes tarefas: Criar um cadastro de funções em nossa página Default.aspx. Cadastrar a função admin. Criar um controle de atribuição de funções a usuários também na pagina Default. Adicionar seu usuário a esta função. Definir que nossa página administracao.aspx só poderá ser acessada por um usuário pertencente a função admin. Testar a aplicação. Criando um cadastro de Funções Antes de tudo devemos habilitar o gerenciamento de funções em nossa aplicação, que por padrão é desabilitado. Para isso adicione o seguinte nó dento de <system.web>: <rolemanager enabled="true"/> 142

143 Agora adicione a página Default.aspx um controle textbox com um rótulo Grupo e um button com um rótulo adicionar logo ao lado. Adicione também um novo controle ListBox (já deve existir um para exibição de usuários) com o rótulo Funções. Sua página, em tempo de design, deve se parecer com a imagem abaixo. Agora vamos adicionar algumas linhas de código. Altere seu método Load da pagina de acordo com a listagem abaixo: If Not Page.IsPostBack Then ListBox1.DataSource = Membership.GetAllUsers ListBox1.DataBind() Roles_DataBind() End If if (!Page.IsPostBack) { ListBox1.DataSource = Membership.GetAllUsers(); ListBox1.DataBind(); Roles_DataBind(); } Crie um método Roles_dataBind, que atualiza as funções no listbox: 143

144 Sub Roles_DataBind() ListBox2.DataSource = Roles.GetAllRoles ListBox2.DataBind() End Sub void Roles_DataBind() { ListBox2.DataSource = Roles.GetAllRoles(); ListBox2.DataBind(); } Agora de um duplo clique sobre o botão Incluir, e sobre o manipulador de evento criado adicione o seguinte código: Roles.CreateRole(TextBox1.Text) Roles_DataBind() Roles.CreateRole(TextBox1.Text); Roles_DataBind(); Tudo o que foi feito é adicionar uma nova função a partir do texto informado no controle textbox. Rode a aplicação, informe admin como nome para a função clique em Incluir: 144

145 Criando um controle de atribuição de funções a usuários Para adicionar uma função a um usuário, vamos verificar o usuário selecionado, a função seleciona e em seguida fazer a adição, tudo através do clique de um botão Adicionar Função. Para exibir a função de um determinado usuário, um clique em outro botão Funções do Usuário devera exibir em um listbox as funções atribuídas ao usuário selecionado. Primeiramente adicione ao seu WebForm default.aspx um botão de texto Adicionar Função, um botão de texto Funções do Usuário ao lado do listbox de usuários, e um novo listbox abaixo deste botão. Seu formulário agora deverá se parecer com a imagem abaixo: 145

146 Agora um pouco de código. No manipulador do evento do botão Adicionar Função coloque: Roles.AddUserToRole(ListBox1.SelectedItem.Text,_ ListBox2.SelectedItem.Text) Roles.AddUserToRole(ListBox1.SelectedItem.Text, ListBox2.SelectedItem.Text); Já para o botão Funções do usuário: ListBox3.DataSource = Roles.GetRolesForUser(ListBox1.SelectedItem.Text) ListBox3.DataBind() 146

147 ListBox3.DataSource = Roles.GetRolesForUser(ListBox1.SelectedItem.Text); ListBox3.DataBind(); O que o código acima faz é simplesmente pegar as funções do atribuídas ao usuário selecionado no Listbox1 e listadas no listbox3. Rode a aplicação e adicione a função admin ao seu usuário: 147

148 Definindo que nossa página Administracao.aspx só poderá ser acessada por um usuário pertencente a função admin Para que apenas usuários do grupo admin possam acessar a página Administracao.aspx, tudo a fazer é adicionar um novo nó location em nosso web.cofig, da seguinte forma: <location path="administracao.aspx"> <system.web> <authorization> <allow roles="admin"/> <deny users="*"/> </authorization> </system.web> </location> Observe que a estrutura do nó é semelhante a utilizada anteriormente para tornar a página NovoUsuario.aspx, porém aqui ao invés de autorizarmos um usuário estamos autorizando uma função, e negando acesso a todos os demais usuários. Para testar crie um novo usuário e não o adicione a função admin, faça o login com o mesmo e tente acessar a pagina Administracao.aspx. Faça o mesmo com seu usuário que foi incluído na função admin. Arquivo web.config Abaixo segue o arquivo web.config final, utilizado em nossos exemplos até aqui. Apenas comentários foram removidos por praticidade. <?xml version="1.0"?> <configuration xmlns=" <appsettings/> <connectionstrings/> <system.web> <compilation debug="true" strict="false" explicit="true"/> <pages> <namespaces> <clear/> <add namespace="system"/> <add namespace="system.collections"/> <add namespace="system.collections.specialized"/> <add namespace="system.configuration"/> <add namespace="system.text"/> <add namespace="system.text.regularexpressions"/> <add namespace="system.web"/> <add namespace="system.web.caching"/> <add namespace="system.web.sessionstate"/> <add namespace="system.web.security"/> 148

149 <add namespace="system.web.profile"/> <add namespace="system.web.ui"/> <add namespace="system.web.ui.webcontrols"/> <add namespace="system.web.ui.webcontrols.webparts"/> <add namespace="system.web.ui.htmlcontrols"/> </namespaces> </pages> <rolemanager enabled="true"/> <authentication mode="forms"> <forms name=".aspxauth" loginurl="login.aspx" defaulturl="default.aspx"> </forms> </authentication> <authorization> <deny users="?"/> </authorization> </system.web> <location path="administracao.aspx"> <system.web> <authorization> <allow roles="admin"/> <deny users="*"/> </authorization> </system.web> </location> <location path="novousuario.aspx"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location> <system.net> <mailsettings> <smtp <network host="smtp.portal.com" port="25" username="user" password="123" /> </smtp> </mailsettings> </system.net> </configuration> MemberShip e Roles, algumas técnicas avançadas Agora veremos alguns recursos avançados de MemberShip e Roles disponíveis no ASP.NET 3.5. Por padrão, o ASP.NET cria um banco de dados SQL Express de nome ASPNETDB.MDF em App_Data com todos os objetos necessário para a gerenciamento de memberships e roles. O cenário pode ser visualizado na figura 1: 149

150 Com certeza é uma alternativa prática, porém temos aqui alguns problemas: Seu site provavelmente vai ter um banco de dados de aplicação. Você terá então dois bancos de dados independentes para uma mesma aplicação! Provavelmente alguma regra de negócio de seu aplicativo vai precisar interagir de alguma forma com a base de dados de membership e roles, como numa auditoria, por exemplo. Sua aplicação vai ter que buscar estar informações em outro banco de dados, em outro SGBD! Por padrão o banco de dados de gerenciamento estará junto ao Servidor de Internet. Você pode querer colocá-lo em um servidor de banco de dados dedicado, ou mesmo sequer deseja instalar o SQL Server junto ao Servidor Web. Um banco de dados SQL Server edição Express possui algumas limitações técnicas. A boa noticia é que o ASP.NET permite que seja utilizado nosso próprio banco de dados para o gerenciamento de membership e roles, como exibido na figura 2. Fazer isso é simples, e basicamente deve ser feito em duas etapas: Criar os objetos necessários no seu banco de dados: O gerenciamento de memberships e roles é feito através de um conjunto especifico de tabelas, views e stored procedures, que deverão ser de alguma maneira criados no seu banco de dados. 150

151 Configurar a sua aplicação para usar seu banco de dados: Devemos configurar a aplicação para que faça o gerenciamento de usuários e funções não mais através do banco de dados padrão, utilizando o nosso banco de dados ao invés disso. Criando os Objetos Você pode criar os objetos necessários diretamente no seu banco de dados ou então produzir um script DDL com os mesmos. O.NET possui a Ferramenta ASP.NET SQL Server SetupWizard que pode ser utilizado tanto para criá-los ou mesmo para produzir o script. Gerando os objetos diretamente no seu banco de dados Para gerar o schema diretamente no seu banco de dados, basta rodar o aplicativo ASP.NET SQL Server SetupWizard (ASPNET_REGSQL), que pode ser encontrado no caminho C:\WINDOWS\Microsoft.NET\Framework\v , ou executado mais facilmente através do Visual Studio 2008 Command Prompt que pode ser encontrado no conjunto de programas do Visual Studio. No prompt de comando basta digitar ASPNET_REGSQL. A primeira tela do programa traz algumas informações sobre a criação dos objetos: 151

152 Na segunda etapa devemos informar se desejamos preparar nossa aplicação ou remover as configurações, obviamente vamos optar pela primeira opção: Em seguida devemos informar o servidor, o banco de dados e as informações de login para a criação dos objetos: 152

153 Em seguida um sumário das configurações é exibido: Por fim o aplicativo informa que os objetos foram criados: 153

154 Se examinarmos o banco de dados, podemos ver que foram criadas diversas tabelas, procedures e views específicas para o uso do ASP.NET: 154

155 Gerando um Script Além do wizard exibido anteriormente, através do mesmo aplicativo, porém através da linha de comando, podemos produzir um script DDL. Se você for distribuir o banco de dados de sua aplicação através de um script, provavelmente você acharia ótimo incluir também o script para criação dos objetos de Membership e Roles. Podemos gerar o script para um arquivo, informando quais funcionalidades desejamos utilizar. Por exemplo, para gerarmos um script com toda a funcionalidade para um arquivo de nome ASPScript.SQL, basta executar o seguinte comando: ASPNET_REGSQL sqlexportonly C:\ASPScrip.sql -A all Será gerado o script no arquivo C:\ASPScrip.sql com todas as funcionalidades incluídas. Para mais opções digite o comando ASPNET_REGSQL -? Configurando sua aplicação Criar os objetos necessários em seu banco de dados não é o suficiente. Se o ASP.NET não souber que você deseja que as funcionalidades de Membership e Roles sejam armazenadas em seu próprio banco de dados, ele vai continuar a usar o arquivo SQLExpress na pasta App_Data. Tudo a fazer é incluir algumas entradas no arquivo web.config de sua aplicação: <membership defaultprovider="sqlprovider" userisonlinetimewindow="15"> <providers> <add name="sqlprovider" type="system.web.security.sqlmembershipprovider" connectionstringname="minhastring" applicationname="minhaaplicacao" enablepasswordretrieval="false" enablepasswordreset="true" passwordformat="hashed" requiresquestionandanswer="true" minrequiredpasswordlength="1" minrequirednonalphanumericcharacters="0"/> </providers> 155

156 </membership> Acima configuramos as funcionalidades de MemberShip, observer o nó provider, o atributo name tem o valor de SqlProvider, type como System.Web.Security.SqlMembershipProvider. Outro atributo importante é ConnectionStringName, que deve apontar para um string de conexão no mesmo arquivo web.config contendo as informações do servidor e banco de dados onde deverá estar a estrutura de gerenciamento de membership. Para exemplificar, a string de conexão MinhaString poderia ser adiciona no web.config da seguinte forma: <connectionstrings> <add name="minhastring" connectionstring="data Source=Servidor;Initial Catalog= AdventureWorks;User ID=sa;Password=123" providername="system.data.sqlclient"/> </connectionstrings> Para o gerenciamento de Roles devemos adicionar um nó rolemanager, semelhante ao anterior: <rolemanager defaultprovider="sqlprovider" enabled="true" cacherolesincookie="true" cookiename=".asproles" cookietimeout="30" cookiepath="/" cookierequiressl="false" cookieslidingexpiration="true" cookieprotection="all"> <providers> <add name="sqlprovider" type="system.web.security.sqlroleprovider" connectionstringname="minhastring" applicationname="minhaaplicacao"/> </providers> </rolemanager> Observe novamente as informações de name do provedor, tipo e string de conexão. Os recursos de membership e roles foram sem duvida uma grande novidade no ASP.NET 3.5. Poder direcionar suas funcionalidades para um banco de dados especifico torna este recurso ainda mais funcional e útil! 156

157 12.Manutenção de Estado Em aplicação que não mantêm estado por natureza, como nossas aplicações web, utilizamos alguns mecanismos para manter as informações importantes para nosso negocio entre uma requisição e outra. O IIS por sua vez incorpora um cookie com um identificador único no cabeçalho de cada requisição http, que é enviada de volta pelo navegador. Esse cookie que torna possível identificar um mesmo usuário entre os diversos vai e volta de uma aplicação Web. Desta forma a cada requisição poderíamos gravar em um banco de dados às informações importantes daquele momento, vamos supor o nome do usuário. Na próxima requisição pegamos novamente este identificador único e faríamos uma consulta em no banco de dados, já saberíamos de qual usuário se trata, poderíamos então armazenar neste momento as informações de um produto que o usuário resolver comprar e assim a vida seguiria tranquilamente. Esta é uma forma primitiva e árdua de manter estado, existem diversas outras técnicas, todas com seus prós e contras, é o que vamos estudas nas próximas sessões. Profiles Manter informações em variáveis de sessão é um dos recursos mais simples e utilizados para manter o estado de uma aplicação Web: Armazenamos as informações importantes em variáveis de sessão. A aplicação faz automaticamente a associação entre o Identificador Único explicado na sessão anterior e as varias de sessão do mesmo. No ASP.NET 2.0 o recurso de personalization tornou isso mais fácil. Agora, podemos gerenciar informações de forma mais intuitiva e fácil, com ajuda inclusive do Intelissense. Um exemplo simples Vamos começar com um exemplo simples, para isso crie uma aplicação ASP.NET. Esta aplicação será usada durante todos os exemplos deste capitulo. 157

158 Crie duas páginas em sua aplicação: Inicial.aspx e Final.aspx. Na primeira coloque um controle TextBox e um Controle Button de texto Enviar e na outra um controle label. Altere seu arquivo web.config, incluindo um nó profile da seguinte forma: <profile> <properties> <add name="nome"/> </properties> </profile> Ao final deste capitulo você pode encontrar o web.config na sua versão final. De um duplo clique no botão Enviar e adicione o seguinte: Profile.Nome = TextBox1.Text Response.Redirect("Final.aspx") Profile.Nome = TextBox1.Text; Response.Redirect("Final.aspx"); No evento Load da pagina Final.aspx: Label1.Text = Profile.Item("Nome") Label1.Text =Convert.ToString( Profile["Nome"]); Note que o qualquer propriedade que você definir no profile estará disponível no intellisense: 158

159 Turbinando a propriedade Você pode ainda definir algumas características de uma propriedade de um profile, como tipo e valores padrão. Veja o web.config anterior agora com a propriedade nome definida como string e com valor padrão igual a Anônimo: <profile> <properties> <add name="nome" type="system.string" defaultvalue="anônimo" /> </properties> </profile> Definindo Grupos Outra funcionalidade é organizarmos nossas propriedades em grupos. No nosso exemplo vamos adicionar um grupo Endereco, para armazenar o logradouro, número, cidade e estado do usuário: <profile> <properties> <add name="nome" type="system.string" defaultvalue="anônimo" /> <group name="endereco"> <add name="logradouro"/> <add name="numero"/> <add name="cidade"/> <add name="estado"/> </group> </properties> </profile> Adicione mais três controles textbox na pagina Inicial.aspx para que o usuário digite estas novas propriedades: 159

160 Altere o código do botão enviar de acordo com o exemplo a seguir: Profile.Nome = TextBox1.Text Profile.Endereco.Logradouro = TextBox2.Text Profile.Endereco.Numero = TextBox3.Text Profile.Endereco.Cidade = TextBox4.Text Profile.Endereco.Estado = TextBox5.Text Response.Redirect("inicial.aspx") Profile.Nome = TextBox1.Text; Profile.Endereco.Logradouro = TextBox2.Text; Profile.Endereco.Numero = TextBox3.Text; Profile.Endereco.Cidade = TextBox4.Text; Profile.Endereco.Estado = TextBox5.Text; Response.Redirect("inicial.aspx"); Já nosso evento Load na página Final.aspx devera ficar assim: Label1.Text = Profile.Nome & " " & _ Profile.Endereco.Logradouro & " " & _ Profile.Endereco.Numero & " " & _ Profile.Endereco.Cidade & " " & _ Profile.Endereco.Estado 160

161 Label1.Text = Profile.Nome + " " + Profile.Endereco.Logradouro + " " + Profile.Endereco.Numero + " " + Profile.Endereco.Cidade + " " + Profile.Endereco.Estado; Session Como explicado algumas sessões atrás, uma das formas mais simples de manutenção de estado é através de variáveis de sessão. Cada variável esta associada ao cookie de identificação do usuário. Por padrão, estas informações estão armazenadas no próprio processo do ASP.NET. Uma novidade da era.net foi a possibilidade de armazenamento de informações de sessão em um processo separado (um servidor de estado) ou até mesmo em um SGBD. Isto trouxe novos horizontes ao desenvolvimento de aplicações Web em ASP.NET, pois simplificou a criação dos chamados Web Farms, termo que define um conjunto de servidores rodando uma aplicação especifica. Em nosso curso vamos estudar apenas o gerenciamento de sessão no próprio processo do ASP.NET (inproc), que é o comportamento padrão. Uma variável de sessão esta associada a exclusivamente a uma única sessão. Isto significa que um dado armazenado em uma variável de nome X para o usuário João não será visível na variável de sessão de mesmo nome do usuário Pedro, e vice-versa. Para testarmos o uso de variáveis de sessão, vamos criar uma pequena aplicação que vai armazenar um valor em uma variável e exibi-lo em outra página. Em seguida vamos rodar uma outra instancia da mesma aplicação para verificar que os valores armazenados diferem de uma instancia para outra. Para isso crie uma nova aplicação ASP.NET com duas páginas: Inicial.aspx e Final.aspx. Na primeira coloque um controle TextBox e um Controle Button de texto Enviar e na outra um controle label. De um duplo clique sobre o botão enviar e no manipulador de evento criado insira o seguinte código: Session("Nome") = TextBox1.Text Response.Redirect("Final.aspx") 161

162 Session["Nome"] = TextBox1.Text; Response.Redirect("Final.aspx"); No evento Load da página Final.aspx insira a código abaixo: Label1.Text = Session("Nome") Label1.Text = Session["Nome"]; O identificador de uma variável de sessão é sensível a diferenciação entre letras maiúsculas e minúsculas, portanto Nome representa uma variável e nome outra. Defina Inicial.aspx como pagina inicial, rode a aplicação, digite um valor na caixa texto e observe o valor ser exibido na página seguinte. Você tambem pode armazenar qualquer tipo de objeto em uma variavel de sessão. HiddenField Uma das formas mais simples e antigas de manter estado dentro de uma mesma página é através de campos ocultos. O valor atribuído ao controle é mantido na propriedade value entre post backs, porém não é renderizado na página. ViewState Imagine a seguinte situação: em um determinado ponto de um cadastro o usuário, após informar diversos dados cadastrais, tem que digitar o CEP para que o sistema faça a busca do endereço. O post back é acionado e quando a requisição volta ao navegador, todos os dados digitados se perderam em algum lugar do cyberspace. Claro que ninguem vai criar um aplicativo com desta forma, porém o exemplo é para lembrar que no ASP classico e em outras diversas linguagens de programação para Web, devemos manter o estado da página manualmente, ou seja, digitando muitas linhas de código. No ASP.NET o recurso de ViewState mantem automaticamente os valores de controles de servidor entre um post back e outro. Na verdade o ViewState internamente nada mais 162

163 é do que uma campo oculto um pouco mais sofisticado. Se você rodar uma aplicação ASP.NET sem qualquer controle verá que é criado um campo oculto para o armazenamento do ViewState: <input type="hidden" name=" VIEWSTATE" id=" VIEWSTATE" value="/wepdwujnzgzndmwntmzzgs8mo25pqr00v4slvgsxg3devk+ha==" /> Note que os dados não são exibidos em texto plano, por questões de segurança. Porém este é um recurso palhativo e não devemos utilizá-lo para manter dados sensíveis. Você ainda pode usar o ViewState para adicionar manualmente valores ao ViewState, lembrando que você vai conseguir recuperá-los apenas entre um post back e outro na mesma página. Abaixo um pequeno exemplo de atribuição de um valor ao ViewState: ViewState("Nome") = "Fernando Amaral" ViewState["Nome"] = "Fernando Amaral"; QueryString Outro modelo clássico de manutenção de estado é o através do uso de querystrings, que nada mais são do que conjuntos de pares/valores anexados a URL, provavelmente você já deve ter visto dezenas de páginas usando este recurso. Sua utilização é simples, após a URL você adiciona o primeiro valor na forma?chave=valor. Para passar mais de um conjunto, os mesmos devem ser concatenados através do caractere &. Para recuperar o valor na outra página basta usar Request.QueryString. Crie uma nova aplicação ASP.NET com duas páginas: Inicial.aspx e Final.aspx. Na primeira coloque dois controles TextBox, um para digitação do nome e outro para idade e um Controle Button de texto Enviar e na outra um controle label. Para montar a URL de redirecionamento com as duas variáveis: Response.Redirect("Final.aspx?" & "Nome=" & TextBox1.Text & "&Idade=" 163

164 & TextBox2.Text) Response.Redirect("Final.aspx?" + "Nome=" + TextBox1.Text + "&Idade=" + TextBox2.Text); Para recuperar os valores na pagina seguinte: Label1.Text = Request.QueryString("Nome") & " " & Request.QueryString("Idade") Label1.Text = Request.QueryString["Nome"] + " " + Request.QueryString["Idade"]; Cookies Outra forma de manutenção de estado é através do uso de cookies, que nada mais é do que um pequeno arquivo de texto que armazenado na maquina do usuário. Sua grande vantagem é que você pode identificar o usuário mesmo dias depois de seu acesso a página. Este recurso é muito usado, pro exemplo, em sites de comercio eletrônico, para exibir as preferências do usuário os últimos produtos que ele navegou. O grande problema dos cookies é que o usuário simplesmente pode desabilitar este recurso em seu navegador. Cross Page Postback Uma nova funcionalidade do ASP.NET a partir da versão 2.0 é capacidade de recuperação de informações entre diferentes páginas. Este recurso já foi visto em nosso primeiro módulo. Application Semelhante em diversos aspectos com variáveis de sessão, com uma importante diferença: As variáveis de aplicação são compartilhadas entre todas os usuários da aplicação. Uma variável de aplicação esta associada a toda a aplicação. Isto significa que um dado armazenado em uma variável de nome X para o usuário João será visível na variável de aplicação de mesmo nome do usuário Pedro, e vice-versa. 164

165 Outra diferença importante é que uma variável de aplicação estará disponível durante toda a vida da aplicação, enquanto uma variável de sessão será perdida ao fim da sessão do usuário. Crie uma nova aplicação ASP.NET com duas páginas: Inicial.aspx e Final.aspx. Na primeira coloque um controle TextBox para digitação do nome e um Controle Button de texto Enviar e na outra um controle label. Na página Incial.aspx digite o seguinte código no manipulador de evento criado no botão Enviar (observe que não há redirecionamento): Application("Nome") = TextBox1.Text Application["Nome"] = TextBox1.Text; No evento Load da pagina Final.aspx digite o seguinte código: Label1.Text = Application("Nome") Label1.Text = Application["Nome"]; Para testar, defina Inicial.aspx como página inicial, informe seu nome e clique no botão enviar. Feche a aplicação e vá tomar um copo de água. Na volta, defina Final.aspx como pagina inicial, rode a aplicação e observe o resultado. Você pode ser perguntar como foi possível recuperar o valor já que ninguém estava usando a aplicação em determinado momento. Na verdade, mesmo que ninguém utiliza a aplicação, os valores de variáveis de aplicação só serão perdidos quando a última sessão expirar. Caching Aplicações web podem ter de atender centanas de milhares de usuários, e temos que usar todos os recursos disponíveis para mante-la rodando com uma boa performance. Normalmente alguns recursos são exibidos a diferentes usuários sem sequer que tenha havido tempo para estas informações serem alteradas. De qualquer forma, se nada for 165

166 feito, a cada acesso a aplicação vai novamente buscar essas informações onde quer elas estejam. Para citar um exemplo, se seu aplicativo em uma pagina de cadastro exibe uma relação de cidades em um ComboBox para que o usuário faça a escolha de uma. A cada novo usuário sua aplicação vai abrir uma conexão com o banco de dados, executar a consulta e preencher o ComboBox. Qual o custo desta tarefa para sua aplicação? Qual a probabilidade da relação de cidades mudar nas proximas horas? O ASP.NET nos oferece diversos recusos de armazenamento em cache, vamos estadalos a seguir. Output Caching A adicão de uma diretiva de compilação em uma página ASP.NET já vai colocar a página em cache. Para fazer um teste, coloque a diretiva a seguir logo abaixo da <%@ OutputCache Duration="30" VaryByParam="None" %> Coloque um label em sua página e no evento Load digite o código abaixo: Label1.Text = DateTime.Now.ToString Label1.Text = DateTime.Now.ToString(); Rode a aplicação. Observe a hora exibida. Pare a aplicação e rode novamente ou simplismente atualize a página. Veja que a hora continua a mesma, sem atualização. Aguarde em torno de 30 segudos, que foi o tempo de duração informado na diretiva e rode a aplicação novamente. Observe que a hora é atualizada. Variação por Parametros O atributo VaryByParam, utilizado no exemplo anterior nos permite criar versões diferentes para variações de determinado parâmetro na Query String da aplicação. Para exemplificar, no exemplo anterior altera a diretiva da seguinte maneira: 166

167 OutputCache Duration="30" VaryByParam="Codigo" %> Rode a aplicação e adicione a?codigo=1 ao final da Url, como no exemplo abaixo: Memorize a hora, altere o código para 2 e tecle Enter. Note que hora mudou. Volte o valor do parâmetro para 1 e tecle Enter. Note que é exibido a hora anterior, ou seja, que estava armazenada em cachê. Você pode especificar o armazenamento por mais de um parâmetro, bastando para isso informa-los separados por ;. O armazenamento se dará sempre pela combinação de todos os parâmetros, ou seja, sempre que surgir uma nova combinação de valores, um novo armazenamento será gerado. Para que seja aplicado cache a todos os parâmetros, basta informa *. VaryByControl Através do atributo VaryByControl, podemos definir que determinado controle da página seja armazenado em cachê, bastando para tanto informar o nome do mesmo: <%@ OutputCache Duration="30" VaryBycontrol="Label1" %> O uso de VaryByControl é ideal para o armazenamento de User Controls. Substitution 167

168 As vezes queremos manter em cache a página inteira, porem determinada informação precisa ser dinâmica e variar de usuário pra o usuário ou mesmo em função do tempo. Um bom exemplo é exibir a hora atualizada pro usuário, ou mesmo seu nome de login. O ASP.NET disponibiliza para isso um controle Subtituton, que recebe na sua propriedade MetodName o nome de um método que será dinâmico, ou seja, não será armazenado em cache. Este método deve deve ser shared /static e receber como parâmetro um tipo HttpContext. Adaptar o nosso primeiro exemplo, em que exibimos a data e hora em label, para ter uma porção da página exibindo a hora sem armazendo em cache, utilizando um Substitution, é facil. Primeiramente adicione a seguinte função a página: Public Shared Function RetornaHora(ByVal context As HttpContext) _ As String Return DateTime.Now.ToString() End Function public static string RetornaHora(HttpContext context) { return DateTime.Now.ToString(); } Em seguida acione um controle Subtitutio e denina sua propriedade MethodName como RetornaHora. Rode a aplicação. Atualize a página algumas vezes e note que o Label colocado anteriormente mantem fixo o valor da hora enquato o cache não espira. Já o controle Substitution renderiza a data e hora atualizados. 168

169 Programando cache manualmente Para poder aproveitar o Maximo da funcionalidade de cache, você pode programar a sua utilização. O funcionamento básico é semelhante ao de variáveis de sessão e aplicação, basta ler ou gravar o valor através de um identificador único: Cache("Nome") = "Fernando" Cache["Nome"] = "Fernando"; Outra maneira de utilizar cache é usando o método Insert. O primeiro parâmetro é o identificador, o segundo é o abjeto a ser armazenado: Cache.Insert("Nome", "Fernando") Cache.Insert("Nome", "Fernando"); O método Insert possui ainda algumas sobrecargas, que permitem criar dependências, ou determinar o tempo de expiração do cache. O tempo de expiração pode ser absoluto, onde você deve informar a hora exata em que o cache vai expirar, ou sliding, em que 169

170 você informa o tempo de expiração a partir da criação do cache. O exemplo abaixo coloca um string em cache por 20 segundos: Cache.Insert("Nome", "Fernando", Nothing, DateTime.MaxValue,_ TimeSpan.FromSeconds(20)) Cache.Insert("Nome","Fernando", null, DateTime.MaxValue, TimeSpan.FromSeconds(20)); 170

171 ASP.NET AJAX Antes de tentarmos entender o Ajax, é preciso conhecer a Web 2.0 e onde o Ajax se encaixa neste conceito. Web 2.0 Embora a Web seja algo revolucionário e tecnologicamente inovador, na verdade hoje ela esta passando pela sua pré-história. Fazendo-se uma analogia, podemos pensar na revolução que foi a produção da TV em escala industrial lá pela década de 40, com baixíssima qualidade, preto e branca com a TV digital que esta surgindo nos dias de hoje. A Web atual é uma TV da década de 40. Já muito se fala em Web 2.0, que seria a segunda geração de aplicações para Internet, onde a Internet passaria a ser a plataforma das aplicações, acessadas inteiramente através de navegadores: mais interativas, mas leves, mas dinâmicas... Mas aonde o Ajax entra nisso tudo? O Ajax é a tecnologia que torna possível trazer muitos dos conceitos da Web 2.0 para as aplicações de fato. O Ajax é o responsável pela característica de interatividade e interfaces ricas e amigáveis da Web 2.0. Ajax Quando ensino ASP.NET para programadores que nunca criaram uma aplicação Web, noto que alguns tem dificuldades em entender o diferente modelo de funcionamento de uma aplicação Internet: O que estamos vendo no browser é o resultado de um requisição processada por uma aplicação no servidor. Em nosso navegador, cada vez que enviamos uma requisição de processamento, todo conteúdo é empacotado, enviado e processado pelo servidor e em seguida devolvido ao navegador, que trata de interpretar e exibir este resultado novamente para o usuário. O problema é que, a cada requisição, a página inteira trafega entre o servidor e o cliente. Isto nos trás alguns problemas: Trafego desnecessário na rede, maior carga de processamento, tempo de espera pelo processamento da requisição. 171

172 A idéia do Ajax, acrônimo para Asynchronous JavaScript and XML, é permitir que apenas a parte necessária da página seja enviada e processada no servidor: é um modelo de funcionamento assíncrono: isto quer dizer que o usuário não precisa esperar o final do processamento da requisição para continuar executando a aplicação...note agora que o benefício é muito maior do que apenas evitar que a página pisque: é redução de tráfego, é aumento de desempenho, é maior interatividade. Embora o acrônimo fale apenas em JavaScript e XML, temos diversas outras tecnologias envolvidas quando usamos Ajax: CSS, DOM e XMLHttpRequest. A requisição ao Ajax ao servidor é na forma de um objeto XMLHttpRequest. Após processada, o resultado em XML é processado pelo cliente, onde apenas as alterações são exibidas. Nada de Novo É curioso o fato de que muitas tecnologias já existentes a muito tempo, às vezes décadas, de repente se tornam a sensação do momento: Orientação a Objetos, infra-estrutura de Chaves Públicas etc. para citar apenas alguns. Da mesma forma, o modelo de funcionamento do Ajax, através de chamadas assíncronas por javascript, não é novo. O objeto XMLHttpRequest surgiu no final da década de 90, lançado primeiro pela Microsoft, junto com o navegador Internet Explorer 5, na forma de um ActiveX. Mais tarde surgiu em outros navegadores, na forma de um objeto Java. AJAX no ASP.NET 2.0 e Visual Studio 2005 Para o Visual Studio 2005, o Ajax Extensions traz um conjunto de controles simples, que permitem a execução de chamadas assíncronas através de controles visuais, ocultando a complexidade de se trabalhar diretamente com o objeto XMLHttpRequest. Além disso, foi lançado também um conjunto de controles, o AJAX toolkit, com um conjunto de diversas funcionalidades já prontas. No Visual Studio 2005 e ASP.NET 2.0 o AJAX deve ser instalado a parte, através de um instalador fornecido pela Microsoft. AJAX no ASP.NET 3.5 e Visual Studio

173 O AJAX já é parte integrante do.net Framework 3.5 e do ASP.NET 3.5. Os controles AJAX Extensions, ao contrário do que ocorre com o Visual Studio 2005, já vem integrados ao Visual Studio 2008 e não requerem instalação a parte. No Visual Studio 2005 era necessário criar uma aplicação a partir de um Templates para podermos utilizar AJAX em uma aplicação, ou alguma informações deveriam ser inseridas manualmente no arquivo Web.Config. No Visual Studio 2008 qualquer aplicação ASP.NET já esta pronta para o AJAX, não é preciso criá-la a partir de um Templates, tampouco é necessário intervenções no Web.Config. AJAX Extensions O poder do AJAX esta disponível em conjunto de controles na barra de ferramentas do Visual Studio: Antes de entrarmos na parte prática, vamos qual a função de cada controle: ScriptManager: O controle mais importante, ele que habilita as funcionalidades do AJAX na página. Deve existir apenas um em cada web form; ScriptManagerProxy: Utilizado com a função do ScriptManager em uma página de conteúdo. No capitulo sobre Master Pages, vimos que cada página que utiliza uma página Master, é denominada página de conteúdo. Deve funcionar em conjunto com o controle ScriptManager da página Master; Timer: Este controle deve ser utilizado para executar eventos em determinados intervalos. Veremos seu uso na prática; UpdatePanel: Talvez o controle mais importante, permite que partes de uma pagina sejam atualizados de forma assíncrona; 173

174 UpdateProgress: Se a requisição assíncrona for demorada, podemos utilizar este controle para dar feedback ao usuário enquanto ele aguarda, seja exibindo uma mensagem ou mesmo uma imagem animada; Exemplo prático com Update Panel Neste primeiro exemplo veremos como é simples e rápido criar uma aplicação simples já capaz de fazer chamadas assíncronas através do ASP.NET Ajax. Primeiramente crie uma nova aplicação ASP.NET: Na web form criado pelo Visual Studio, adicione um controle ScriptManager. Este controle deve ser o primeiro da página. Em seguida adicione um controle UpdatePanel. Este controle é um container, ou seja, dentro dele podemos colocar outros controles. É o que vamos fazer agora, adicione dentro do UpdatePanel um controle Button e um controle Label. Seu código deverá conter os seguintes elementos: <div> 174

175 <asp:scriptmanager ID="ScriptManager1" runat="server"> </asp:scriptmanager> <br /> </div> <asp:updatepanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:button ID="Button1" runat="server" Text="Button" /> <asp:label ID="Label1" runat="server" Text="Label"></asp:Label> </ContentTemplate> </asp:updatepanel> Hora de escrever algum código de servidor. A idéia é atualizar a hora no label. Como estaremos rodando a aplicação local e o processamento será mínimo, não teremos nenhum efeito visual das funcionalidades do AJAX, por isso, alem de atualizar o horário, vamos causar um delay no servidor. De um duplo clique sobre o Button e escreva o seguinte código: Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click System.Threading.Thread.Sleep(1000) Label1.Text = DateTime.Now.ToString() End Sub protected void Button1_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(1000); Label1.Text = DateTime.Now.ToString(); } Agora coloque outro Button e outro label abaixo do UpdatePanel (do lado de fora deste). De um duplo clique sobre o novo botão e escreva o mesmo código, porém escrevendo a data no label2: Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click System.Threading.Thread.Sleep(1000) Label2.Text = DateTime.Now.ToString() End Sub protected void Button2_Click(object sender, EventArgs e) 175

176 { System.Threading.Thread.Sleep(1000); Label2.Text = DateTime.Now.ToString(); } Visualmente seu web form deverá estar semelhante a imagem abaixo: O que teremos ao rodar a aplicação? O primeiro botão irá fazer uma requisição assíncrona, enviando uma informação mínima entre o postback. A segunda requisição fará um postback de toda a página. Rode a aplicação, clique nos dois botões e observe os resultados.se você acha que não pode observar nada diferente, preste mais atenção: Observe que quando você clicar no botão o navegador estará carregando a pagina (Se você usa o Internet Explorer 7, observe o ícone de carregar, que substitui o logo do IE na guia da página), aguardando o final do processamento. 176

177 Adicionando um UpdateProgress Muitas vezes um postback pode ter uma grande carga de processamento e demorar mais do que gostaríamos. Em casos extremos o usuário pode ficar impaciente, ou até achar que ocorreu algum problema. O Controle UpdateProgress é forma de dar um feedback ao usuário enquanto ele aguarda o processamento. O Controle é também do tipo container, você decide o que vai colocar lá dentro: uma mensagem, um gif, uma animação etc. O único requisito para seu funcionamento é colocá-lo na página já preparada para o AJAX e conectá-lo a um UpdataPanel. Vamos ver o funcionamento na prática. Crie uma nova aplicação ASP.NET, coloque um controle ScriptManager e um controle UpdatePanel. Dentro do UpdatePanel coloque um controle label e um controle Button. De um duplo clique sobre o Button e digite o seguinte código: Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click System.Threading.Thread.Sleep(1000) Label1.Text = DateTime.Now.ToString() End Sub 177

178 protected void Button1_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(1000); Label1.Text = DateTime.Now.ToString(); } Note que voltamos a colocar um código para causar um atraso na aplicação, a fim de podermos ter uma visualização do efeito. Agora coloque um controle UpdateProgress, defina a propriedade AssociatedUpdatePanelID como UpdatePanel1, dentro do container do controle escreva uma mensagem como Aguarde...processando! : Rode a aplicação, clique sobre o botão e observe o resultado: 178

179 Triggers No exemplo anterior colocamos o botão que dispara o evento, e o label que mostra a data, dentro de um elemento ContentTemplate. Isto significa que a requisição assíncrona envio informações de ambos os controles no postback. Através de um elemento trigger podemos separar o conteúdo que será atualizado do conteúdo que dispara o evento, otimizando o postback. Vamos ver o funcionamento na prática. Crie uma nova aplicação ASP.NET, coloque um controle ScriptManager e um controle UpdatePanel. Dentro do UpdatePanel coloque um controle label, abaixo e fora do container do UpdatePanel um controle Button. De um duplo clique sobre o Button e digite o seguinte código: Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = DateTime.Now.ToString() End Sub protected void Button1_Click(object sender, EventArgs e) { Label1.Text = DateTime.Now.ToString(); } 179

180 Agora devemos informar o controle que vai disparar o evento. Selecione o UpdatePanel, na janela de propriedades clique em Triggers. Esta é uma coleção de eventos que podem disparar a atualização do conteúdo do UpdatePanel. Clique em Add. Informe em ControlID Button1, em EventName Clik, conforme imagem abaixo: Observe agora o código gerado pelo VS, compare com os exemplos anteriores: <asp:updatepanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:label ID="Label1" runat="server" Text="Label"></asp:Label> </ContentTemplate> <Triggers> <asp:asyncpostbacktrigger ControlID="Button1" EventName="Click" /> </Triggers> </asp:updatepanel> Observe que foi criado um elemento Triggers, que aponta para o controle e o evento que dispara o postback Assíncrono. Roda a aplicação e teste o resultado. 180

181 Usando um Timer Nos exemplos anteriores utilizamos o clique de um botão para disparar a chamada assíncrona ao servidor. O controle Timer permite que chamadas sejam realizadas automaticamente, sem a necessidade da disparada de um evento pelo usuário. Para tal, basta colocarmos um controle Timer dentro de um UpdatePanel, e em seu evento Tick escrever o código a ser executado no servidor. Através da propriedade Interval definimos o intervalo de disparo destes eventos. Para testarmos sua funcionalidade, crie uma nova aplicação ASP.NET 3.5, adicione ao web form criado um ScriptManager e logo abaixo um UpdatePanel. Dentro do UpdatePanel coloque um controle Label e um controle Timer. Defina a propriedade Interval do Timer em 1000 milesecundos, o que equivale a 1 segundo. De um duplo clique sobre o controle Timer e no manipulador de evento criado escreva o seguinte código: Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = DateTime.Now.ToString() End Sub protected void Timer1_Tick(object sender, EventArgs e) { Label1.Text = DateTime.Now.ToString(); } Rode a aplicação e observe a atualização da data a cada segundo: 181

182 182

183 14. Criando e Consumindo WebServices Ao menos que você tenha estado em uma caverna nos últimos anos, com certeza já ouviu falar em XML e Web Service. XML é um padrão de troca de informações, no formato texto. É um padrão aberto e legível até para humanos, por isso tem se tornado um padrão na indústria. Não vou ficar aqui explicando o que o XML é ou não é, pois existem toneladas de material na WEB sobre o mesmo, estou apenas o introduzindo já que ele é importantíssimo na funcionalidade dos Web Services. Um Web Service é uma aplicação web que disponibiliza um serviço qualquer. Quem usa o serviço é o consumidor. As informações trafegam sobre http, através de um protocolo conhecido com SOAP. O formato em que estar informações trafega é nada mais do que em XML. Vários outros acrônimos se aplicação a um Web Service. WSDL, ou Web Service Description Languagem é um arquivo disponibilizado pelo serviço com informações a quem estiver interessado em consumi-lo. Disco é um protocolo de busca de Web Services. Com o advento do.net, criar e consumir Web Services se tornou muito fácil. Quase tudo é feito por trás das câmeras e você precisa se preocupar unicamente com seu produto. Nesta seção vamos criar e consumir um Web Service. Criando um Web Service Para criar um Web Service, vá em New Web Site, e selecione ASP.NET Web Service. 183

184 Por padrão é criado um arquivo asmx, que é equivalente a uma página aspx, porém sua função é prover serviços e não conteúdo. Cada arquivo asmx tem um arquivo.vb ou.cs equivalente, onde são criados os métodos a serem publicados. Um método deve conter um atributo webmetodo, caso contrário ele estará disponível dentro da aplicação mas não externamente a esta. Se você examinar o arquivo.cs ou.vb criado, notará que já existe um método de demonstração criado automaticamente: <WebMethod()> _ Public Function HelloWorld() As String Return "Hello World" End Function [WebMethod] public string HelloWorld() { return "Hello World"; } Vamos criar um método para realizar uma consulta em um banco de dados, em seguida vamos fazer uma aplicação para consumir este método. Nosso método simplesmente vai receber uma consulta como parâmetro, executa-la usando classes do ADO.NET e retornar o resultado. Todo o restante é problema do 184

185 FrameWork, nós não precisamos nos preocupar em gerar arquivos WSDL, gerar XML, incluí-lo na mensagem SOAP etc., tudo é feito de forma transparente. Abaixo segue todo o arquivo service.vb /.cs Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.Data Imports System.Data.SqlClient <WebService(Namespace:=" _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService <WebMethod()> _ Public Function Consulta(ByVal SQL As String) As DataSet Dim Adapter As New SqlDataAdapter(SQL, "Data Source=SERVIDOR;Initial Catalog=AdventureWorks;User ID=sa;Password=123456") Dim Data As New DataSet Adapter.Fill(Data) Return Data End Function End Class using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Data; using System.Data.SqlClient; [WebService(Namespace = " [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { public Service () { } //Uncomment the following line if using designed components //InitializeComponent(); [WebMethod] public DataSet Consulta(string SQL) { SqlDataAdapter Adapter = new SqlDataAdapter(SQL, "Data Source=SERVIDOR;Initial Catalog=AdventureWorks;User ID=sa;Password=123456"); DataSet Data = new DataSet(); Adapter.Fill(Data); 185

186 return Data; } } Note que a única parte adicionada foi o método Consulta. Rode a aplicação, é exibida uma página com informações do Web Service: Clique em Service Description, é exibido o arquivo WSDL gerado pelo ASP.NET, este arquivo contém informações sobre o serviço e é um meio de consulta para um aplicação que deseja consumi-la: 186

187 Você ainda pode testar o Web Service, para isso volte a página inicial, e clique sobre o nome do método Consulta. A página exibe um campo onde você deve entrar o valor do parâmetro, nesta casa SQL. Preencha com um comando SQL: 187

188 Clique em Invoke. O Resultado é exibido em uma nova janela: Consumindo o Serviço Para consumir o serviço crie adicione uma nova aplicação ASP.NET a solução. Clique em propriedades, em seguida clique em Add Web Reference, é exibida a caixa de dialogo abaixo: 188

189 Clique em Web Service in this Solution. Na janela seguinte em Service, que o nome do serviço que criamos no nosso Web Service: 189

190 Em Web reference name mantenha o nome sugerido e clique em Add Rererence: Agora vá a nossa página Default.aspx, adicione um GridView, e no evento OnLoad da página adicione o seguinte código: Imports System.Data.SqlClient Imports System.Data Imports localhost.service Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim Con As New localhost.service Dim Ds As DataSet = Con.Consulta("SELECT * FROM Person.Address" GridView1.DataSource = Ds GridView1.DataBind() End Sub using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; 190

191 using localhost; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Service Con = new Service(); DataSet Ds = Con.Consulta("SELECT * FROM Person.Address"); GridView1.DataSource = Ds; GridView1.DataBind(); } } Rode a aplicação e observe o GridView ser preenchido. Abstraia o fato de você estar rodando o serviço e o consumindo em uma mesma maquina, com um Web Service é possível trocar e fornecer informações de qualquer lugar, através de ambientes heterogêneos ou mesmo incomunicáveis de uma outra forma, utilizando um protocolo aberto e trocando informações através de um padrão reconhecido por toda a industria (XML). 191

192 15. Criando uma página de erros personalizada Erros acontecem e sempre vão acontecer mesmo nas mais grandiosas aplicações. Se não podemos nos livrar totalmente deles, pelo menos temos que tentar encarar uma situação desagradável com esta com a maior classe possível. O ASP.NET nos prove alguns recursos para tratamento de erro, no sentido de exibirmos mensagens padronizadas e mais amigáveis para o usuário. Para exemplificar, primeiramente crie uma aplicação ASP.NET, e na página default digite o seguinte código: Dim con As New SqlConnection con.open() SQLConnection con = New SQLConnection; con.open; Como não informamos os parâmetros necessários para a abertura da conexão, obviamente que nos será exibido um erro: 192

193 Além da mensagem não estar nada amigável, é importante ressaltar que determinadas mensagem, se exibidas para o usuário final, pode expor aspectos delicados de nossa aplicação, podendo inclusive coloca-la em risco. Para criar uma página de erro personalizada, primeiramente devemos criar uma página com este fim especifico. No exemplo, eu crie uma página chamada Erro.aspx e coloquei uma mensagem para o usuário: Em seguida, adicionamos um nó no web.config, como no exemplo abaixo: <customerrors defaultredirect="erro.aspx" mode="remoteonly"> <error statuscode="500" redirect="erro.aspx"/> </customerrors> Vamos entender o que cada elemento significa. Primeiramente o atributo defaulredirect indica qual a página padrão será utilizada caso o código do erro não seja especificado. Note que mais abaixo um nó erro nos diz que para o código 500, utilizamos a mesma página, mas podemos personalizar o redirecionamento para uma página especifica, conforme o tipo de erro. 193

194 O atributo mode é importantíssimo. Ele pode ter três valores: RemoteOnly, que o valor padrão, indica que a página de erro personalizada só será exibida para usuários remotos. Isto permite que você, que esta depurando a aplicação localmente, continue vendo as mensagens de erros detalhas. On significa que todos, remotamente ou localmente verão a página de erro personalizada, e Off, significa que ninguém vai ver a página personalizada, ou seja, será exibido o erro detalhado para todo mundo. Para ver a página de erro funcionando em sua máquina, altere o atributo mode para On, e rode a aplicação: 194

195 16. Eventos da aplicação Diversos eventos disparados por uma aplicação web podem ser capturados e tratados pelo seu sistema. Os manipuladores para este eventos podem ser encontrados no arquivo global.aspx Para criar um arquivo global.aspx, vá em Add new Item e selecione Global Application Class. Os eventos disponíveis são: Application_Start: Ocorre quando a aplicação é iniciada, ou seja, quando o primeiro usuário acessa o site Application_End: Ocorre quando a aplicação termina. Application_Error: Disparado quando há um erro na aplicação. Session_Start: Ocorre quando a sessão inicia. Session_End: Ocorre quando a sessão finaliza. No exemplo abaixo, cada vez que uma sessão inicia, uma variável de aplicação é incrementada e decrementada quando a sessão termina: Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) Application("conta") += 1 End Sub Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) Application("conta") -= 1 End Sub void Session_Start(object sender, EventArgs e) { int i = Convert.ToInt32(Application["conta"]); i += 1; Application["conta"] = i; } void Session_End(object sender, EventArgs e) { int i = Convert.ToInt32(Application["conta"]); i -= 1; Application["conta"] = i; 195

196 } Para exibirmos o número de usuários em nosso site, basta exibir o valor da variável em, por exemplo, um label: Label1.Text = Application("conta") Label1.Text = Convert.ToString(Application["conta"]); 196

197 17. Distribuindo sua Aplicação Normalmente todo o software, depois de finalizado, deve ser distribuído. Aplicações convencionais na sua maioria são distribuídas através de instaladores específicos, o que permite que qualquer usuário possa instalar a aplicação em seu computador de maneira fácil, simplesmente seguindo alguns passos básicos. Aplicações Web na sua maioria são instaladas em um único ou em alguns poucos servidores. Você pode simplesmente copia-la para o destino ou até mesmo gerar um instalador, como numa aplicação convencional. Mas além de distribuir sua aplicação existem outros cuidados que você deve ter antes de colocar sua aplicação em produção. Primeiramente quando você cria sua aplicação, por padrão ele vai estar com a depuração habilitada. A depuração é habilitada no arquivo web.config: <compilation debug="false" strict="false" explicit="true" /> A depuração, como você deve imaginar, permite que você depure seu aplicativo. Isto tem um custo: Alguns arquivos temporários têm que ser mantidos e o desempenho da aplicação é afetado. Quando você roda seu aplicativo pela primeira vez, dentro da IDE do VS, uma caixa de dialogo informa que a depuração esta desabilitada. Você pode habilitá-la ou rodar a aplicação sem depuração, que seria o equivalente a executá-la fora da ambiente do VS: 197

198 Ao autorizar a habilitação de depuração, seu web.config é alterado: <compilation debug="true" strict="false" explicit="true"/> O que isto tem a ver com distribuição de aplicação? É importante lembrar de desabilitar a depuração quando compilar sua aplicação para distribuição, pois será gerado um código otimizado e mais compacto. Outra dica importante é colocar a aplicação em modo de Realise, no próprio VS, como na imagem abaixo: Utilizando Copy Web Site A ferramenta Copy Web Site permite fazer uma copia de sua aplicação, seja para pasta em um sistema de arquivo, um servidor FTP ou até mesmo um diretório sobre o IIS. Para utilzir a ferramenta clique no ícone no solution Explorer. A ferramenta possui uma interface simples, mostrando a esquerda os arquivos da sua apalicação e a direita os arquivos no destino: 198

199 O primeiro passo é apontar o destino, para isso clique em Connect. Neste exemplo escolhi uma pasta local em meu comutador: 199

200 Você pode agora tranferir normalmente um arquivo de um lado para o outro. Note que arquivos alterados e não atualizados sem marcados com uma seta Azul, arquivos escluidos com um icone vermelho: O processo de copia porem simplismente copia a aplicação da forma em que ela se encontra. Para que possamos fazer uma copia para publicação, vamos utilizar o recurso especifico com este fim. Publicação A ferramanta de publicação cria uma cópia pré-compilada de seu site. Para aciona-la, basta clicar com o botão direito sobre o nome da aplicação no Solution Explorer e escolher Publish. A caixa de dialo de publicação é exibida: 200

201 A escolha do local é feita da mesma forma que a ferramenta de copia: pode ser uma pasta, um FTP ou mesmo um diretorio virtual do IIS. Após escolhido o local, basta clicar em Publish. Observe no diretório de destinho que é gerado uma pasta de nome bin, com um assembly em seu interior. Note também que arquivos.vb ou.cs não são incluidos na publicação: Criando um instaldor Outra forma é criar um instaldor. O Visual Studio 2005 permite criar projetos de instação para praticamente qualquer tipo de aplicação. Para criar uma instalador para um web site, clique com o botão direito sobre a solução, selecione Add New Project. Em Other Project Type selecione Setup and Deployment a esquerda, e em templates selecione Web Setup Project: 201

202 No projeto criado, a pasta WebApplicationFolder representa a aplicação a ser instalada. Para adicionar sua apliação ao instalador clique com o botão direito sobre esta pasta, selecione Project Output Na caixa de dialogo Add Projectt Output Grop são exibidos os projetos da solução, se existir apenas um como no exemplo abaixo, simplismente clique em OK. 202

203 Bom, neste ponto você já tem o instalador Pronto! Para testa-lo basta clicar com o botão direito sobre o projeto do instaldor e selecionar Install. O instalador do projeto é executado: 203

204 Durante a instalação você deve informar o nome do Site e do diretório virtual. Após a instalação você pode desintala-la, para isso clique com o botão direito sobre o projeto do instalador e selecione Unistall. Mais recursos de instalação O que você fez foi criar um instalador sem praticamente qualquer configuração, mas as opções que você tem são enormes. Primeiramente, ao clicar no projeto do instalador, veja que você pode personalizar diversas atributos do instalador, como autor, descrição, nome do produto etc. 204

205 Existem ainda diversos editores que podem ser acessados através do solution explorer, são eles: Properties: Permite configurar algumas caracteristicas do instalador. File System Editor: Permite adicionar ou remover arquivos ao instaldor, bem como atalhos para a aplicação na maquina de destino. Registry Editor: Permite manipular o registro do Windows durante a instalação. File Type Editor: Permite associar extensões de arquivo com a programa instalado. User Interface Editor: Talvez o mais interessante e trabalhosos, permite criar, remover e personalizar as janelas que serão exibidas durante o processo de instalação. Custom Action Editor: Permite executar ações personalizadas durante a instalação. A ação deve ser associada a uma fase, como Install, Commit, RollBack, Unistall Lauch condition Editor: Permite avaliar condições para a instalação. 205

206 18. Relatórios com Crystal Report Nesta sessão vamos aprender a criar alguns relatórios básicos com Crystal Report Crie uma nova aplicação Web. Clique com o botão direito sobre a aplicação, selecione Add New Item. Na caixa de dialogo selecione Crystal Report: Será exibido um assitente para configurar o relatório, selecione As a Blank Report e clique em OK: 206

207 No Fields Explorer, clique em Database Fields com botão direito e selecione Database Expert. 207

208 Expanda Create New Connection e selecione OLE DB(ADO): Selecione Microsoft Ole DB Provider for SQL Server e clique em avançar: 208

209 Preencha as informações de servidor, usuário, senha e banco de dados, clique em avançar: 209

210 Algumas informações são exibidas, clique em concluir. De volta ao DataBase expert, selecione a tabela da qual será gerado o relatório: 210

211 De volta ao DataBase Fiedls, expanda o nó da tabela, arraste os campos para a sessão detais de seu relatório: 211

212 Agora abra a sua página Default.aspx, adicione um controle CrystalReportViewer, que pode ser encontrado na Guia Crystal Reports. Na Smart Tag do controle, em Chose Report Souce, selecione New Report Souce: Mantenha o nome padrão e selecione o relatório criado em Specify a Crystal... Rode a aplicação. 212

Não estudaremos detalhadamente todos os Server Controls.

Não estudaremos detalhadamente todos os Server Controls. 4. Controles Uma novidade do ASP.NET 2.0 foi a adição de cerca de 50 novos controles de servidor. Alguns presentes na versão 1.1, como o DataGrid, não estão mais disponíveis na caixa de ferramentas, porém

Leia mais

Validando dados de páginas WEB

Validando dados de páginas WEB Validando dados de páginas WEB Para que validar os dados? Validar os dados informados pelo usuário garante que sua aplicação funcione corretamente e as informações contidas nela tenha algum sentido. Outro

Leia mais

1- ASP.NET - HTML Server Controls

1- ASP.NET - HTML Server Controls 1- ASP.NET - HTML Server Controls Os controles de servidor - Server Controls - HTML são tags HTML padrão, com exceção de possuirem o atributo : runat="server". Vejamos um código que ilustra isto: O atributo

Leia mais

DESENVOLVIMENTO DE SOFTWARE PARA INTERNET LABORATÓRIO 1 PROF. EMILIO PARMEGIANI

DESENVOLVIMENTO DE SOFTWARE PARA INTERNET LABORATÓRIO 1 PROF. EMILIO PARMEGIANI DESENVOLVIMENTO DE SOFTWARE PARA INTERNET LABORATÓRIO 1 PROF. EMILIO PARMEGIANI Exercício 1 Neste exercício trabalharemos com alguns web controls básicos e praticaremos os tipos de dados do C#. Vamos criar

Leia mais

AJAX no GASweb. Mas e afinal, para que usamos o AJAX?

AJAX no GASweb. Mas e afinal, para que usamos o AJAX? Nível - Avançado AJAX no GASweb Por: Pablo Hadler AJAX (Asynchronous Javascript and XML) foi criado com o princípio de ser uma maneira rápida e otimizada de podermos fazer requisições Web, sendo esta totalmente

Leia mais

Criando um projeto ASP.Net no Visual Studio 2008

Criando um projeto ASP.Net no Visual Studio 2008 Criando um projeto ASP.Net no Visual Studio 2008 Ao abrir o Visual Studio 2008, vá no menu File > New > Project (como mostra a imagem abaixo) ou simplesmente pressionando as teclas Ctrl + Shift + N. Nas

Leia mais

Dando um passeio no ASP.NET

Dando um passeio no ASP.NET Dando um passeio no ASP.NET Por Mauro Sant Anna (mas_mauro@hotmail.com). Mauro é um MSDN Regional Director, consultor e instrutor. O principal objetivo da arquitetura.net é permitir ao usuário o fácil

Leia mais

NetBeans. Conhecendo um pouco da IDE

NetBeans. Conhecendo um pouco da IDE NetBeans Conhecendo um pouco da IDE Professor: Edwar Saliba Júnior Sumário Apresentação:...1 Criando Um Novo Projeto de Software:...1 Depurando Um Código-fonte:...4 Entendendo o Código-fonte:...7 Dica

Leia mais

NOTA: Neste tutorial foi utilizado o Visual Studio 2010 para criar o Projeto Web no qual iremos aplicar os temas e os skins.

NOTA: Neste tutorial foi utilizado o Visual Studio 2010 para criar o Projeto Web no qual iremos aplicar os temas e os skins. TUTORIAL 01 USANDO THEMES E SKINS EM UMA APLICAÇÃO ASP.NET ETAPA 1: Criando um novo Web Site usando o Visual Studio 2010 NOTA: Neste tutorial foi utilizado o Visual Studio 2010 para criar o Projeto Web

Leia mais

Scriptlets e Formulários

Scriptlets e Formulários 2 Scriptlets e Formulários Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Permitir ao aluno aprender a criar um novo projeto Java para web no Netbeans IDE,

Leia mais

Repeater no GASweb. Regiões

Repeater no GASweb. Regiões Repeater no GASweb Por: Rodrigo Silva O controle de servidor Repeater é um container básico que permite a você criar uma lista de qualquer informação que deseja em uma página Web. Ele não tem uma aparência

Leia mais

02 - Usando o SiteMaster - Informações importantes

02 - Usando o SiteMaster - Informações importantes 01 - Apresentação do SiteMaster - News Edition O SiteMaster foi desenvolvido para ser um sistema simples de gerenciamento de notícias, instalado em seu próprio computador e com configuração simplificada,

Leia mais

PROGRAMAÇÃO PARA INTERNET RICA INTRODUÇÃO AO ASP.NET

PROGRAMAÇÃO PARA INTERNET RICA INTRODUÇÃO AO ASP.NET PROGRAMAÇÃO PARA INTERNET RICA INTRODUÇÃO AO ASP.NET Prof. Dr. Daniel Caetano 2012-2 Objetivos Conhecer a plataforma ASP.Net Compreender os elementos de um sistema ASP.Net Capacitar o aluno para criar

Leia mais

Manual Integra S_Line

Manual Integra S_Line 1 Introdução O é uma ferramenta que permite a transmissão Eletrônica de Resultado de Exames, possibilitando aos Prestadores de Serviços (Rede Credenciada), integrarem seus sistemas com os das Operadoras

Leia mais

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos TUTORIAL Memória Flash Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br

Leia mais

Validação de formulário : CEP, Email e CPF

Validação de formulário : CEP, Email e CPF Validação de formulário : CEP, Email e CPF Publicado em: 14/09/2003 A ASP.NET veio para facilitar ainda mais o desenvolvimento para WEB, trazendo consigo todo um conjunto inovações que visam facilitar

Leia mais

LAB12: Componentes ASP.NET

LAB12: Componentes ASP.NET LAB12: Componentes ASP.NET Neste laboratório vamos criar uma aplicação ASP.NET que utiliza o componente DropDownList, diversas opções de associação de conteúdo ao componente visual, bem como o uso dos

Leia mais

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP AULA 4 VISÃO BÁSICA DE CLASSES EM PHP Antes de mais nada, vamos conhecer alguns conceitos, que serão importantes para o entendimento mais efetivos dos assuntos que trataremos durante a leitura desta apostila.

Leia mais

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas Microsoft Power Point 2003 No Microsoft PowerPoint 2003, você cria sua apresentação usando apenas um arquivo, ele contém tudo o que você precisa uma estrutura para sua apresentação, os slides, o material

Leia mais

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo.

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo. Manual de Instruções ECO Editor de Conteúdo Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo. O ECO é um sistema amigável e intui?vo, mas abaixo você pode?rar eventuais dúvidas e aproveitar

Leia mais

Manual do Visualizador NF e KEY BEST

Manual do Visualizador NF e KEY BEST Manual do Visualizador NF e KEY BEST Versão 1.0 Maio/2011 INDICE SOBRE O VISUALIZADOR...................................................... 02 RISCOS POSSÍVEIS PARA O EMITENTE DA NOTA FISCAL ELETRÔNICA.................

Leia mais

Criando um carrinho de compras

Criando um carrinho de compras Criando um carrinho de compras Um carrinho de compras feito em ASP.NET para você adaptar ao seu negócio e incluir no seu site. Além de aprender conceitos importantes relacionados a tecnologia ASP.NET vai

Leia mais

Manual do Google agenda. criação e compartilhamento de agendas

Manual do Google agenda. criação e compartilhamento de agendas Manual do Google agenda criação e compartilhamento de agendas 1 O que é o Google Agenda? Google Agenda é um serviço de agenda on line gratuito do Google, onde você pode anotar compromissos e tarefas, organizando

Leia mais

Manual das funcionalidades Webmail AASP

Manual das funcionalidades Webmail AASP Manual das funcionalidades Webmail AASP 1. Configurações iniciais 2. Regras 3. Histórico da conta 4. Autorresposta 5. Dados de acesso (alterando senha de acesso) 6. Identidade (assinatura) 7. Redirecionamento

Leia mais

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela Aula 01 - Formatações prontas e Sumário Formatar como Tabela Formatar como Tabela (cont.) Alterando as formatações aplicadas e adicionando novos itens Removendo a formatação de tabela aplicada Formatação

Leia mais

Procedimentos para Reinstalação do Sisloc

Procedimentos para Reinstalação do Sisloc Procedimentos para Reinstalação do Sisloc Sumário: 1. Informações Gerais... 3 2. Criação de backups importantes... 3 3. Reinstalação do Sisloc... 4 Passo a passo... 4 4. Instalação da base de dados Sisloc...

Leia mais

Material de apoio a aulas de Desenvolvimento Web. Tutorial Java WEB JSP & HTML & CSS & CLASSE & OBJETOS. AAS - www.aas.pro.

Material de apoio a aulas de Desenvolvimento Web. Tutorial Java WEB JSP & HTML & CSS & CLASSE & OBJETOS. AAS - www.aas.pro. Material de apoio a aulas de Desenvolvimento Web Tutorial Java WEB JSP & HTML & CSS & CLASSE & OBJETOS AAS - www.aas.pro.net Março-2012 Este pequeno tutorial tem como objetivo conduzir o programador passo-a-passo

Leia mais

INTRODUÇÃO 2 ACESSO AO SIGTECWEB 3 TEMPO DE CONEXÃO 5 NAVEGAÇÃO 7 BARRA DE AÇÕES 7 COMPORTAMENTO DOS BOTÕES 7 FILTROS PARA PESQUISA 8

INTRODUÇÃO 2 ACESSO AO SIGTECWEB 3 TEMPO DE CONEXÃO 5 NAVEGAÇÃO 7 BARRA DE AÇÕES 7 COMPORTAMENTO DOS BOTÕES 7 FILTROS PARA PESQUISA 8 ÍNDICE INTRODUÇÃO 2 ACESSO AO SIGTECWEB 3 TEMPO DE CONEXÃO 5 NAVEGAÇÃO 7 BARRA DE AÇÕES 7 COMPORTAMENTO DOS BOTÕES 7 FILTROS PARA PESQUISA 8 ACESSO ÀS FERRAMENTAS 9 FUNÇÕES 12 MENSAGENS 14 CAMPOS OBRIGATÓRIOS

Leia mais

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões Prof. MSc. Hugo Souza Se você precisar manter informações sobre seus usuários enquanto eles navegam pelo seu site, ou até quando eles saem

Leia mais

Instalação: permite baixar o pacote de instalação do agente de coleta do sistema.

Instalação: permite baixar o pacote de instalação do agente de coleta do sistema. O que é o projeto O PROINFODATA - programa de coleta de dados do projeto ProInfo/MEC de inclusão digital nas escolas públicas brasileiras tem como objetivo acompanhar o estado de funcionamento dos laboratórios

Leia mais

Mais sobre uso de formulários Site sem Ajax

Mais sobre uso de formulários Site sem Ajax Mais sobre uso de formulários Site sem Ajax Página com busca padrão 1 Página com o resultado da busca carregada no local da anterior (o formulário está vazio) Site com Ajax 2 Site usando Ajax para preencher

Leia mais

Office 365 Manual Outlook 365 Web Application

Office 365 Manual Outlook 365 Web Application Office 365 Manual Outlook 365 Web Application Requisitos para usar o Office 365: Ter instalado pelo menos a versão 7 do Internet Explorer, Mozilla Firefox 15, Google Chrome 21 ou Safari no Mac. O que é

Leia mais

Manual de Utilização do PLONE (Gerenciador de página pessoal)

Manual de Utilização do PLONE (Gerenciador de página pessoal) Manual de Utilização do PLONE (Gerenciador de página pessoal) Acessando o Sistema Para acessar a interface de colaboração de conteúdo, entre no endereço http://paginapessoal.utfpr.edu.br. No formulário

Leia mais

Construtor de sites SoftPixel GUIA RÁPIDO - 1 -

Construtor de sites SoftPixel GUIA RÁPIDO - 1 - GUIA RÁPIDO - 1 - Sumário Introdução...3 Por que utilizar o Construtor de Sites?...3 Vantagens do Construtor de Sites...3 Conceitos básicos...3 Configuração básica do site...5 Definindo o layout/template

Leia mais

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR Novell Teaming - Guia de início rápido Novell Teaming 1.0 Julho de 2007 INTRODUÇÃO RÁPIDA www.novell.com Novell Teaming O termo Novell Teaming neste documento se aplica a todas as versões do Novell Teaming,

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5.

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5. Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5. Ele considera que você já tem o Joomla! instalado no seu computador. Caso você queira utilizá lo em um servidor na web,

Leia mais

Display de 7. PdP. Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Display de 7. PdP. Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos TUTORIAL Display de 7 Segmentos Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br

Leia mais

Linguagem de Programação Procedural (VB) Prof. MSc Eng Marcelo Bianchi AULA 01 - INTRODUÇÃO AO VB

Linguagem de Programação Procedural (VB) Prof. MSc Eng Marcelo Bianchi AULA 01 - INTRODUÇÃO AO VB Linguagem de Programação Procedural (VB) Prof. MSc Eng Marcelo Bianchi AULA 01 - INTRODUÇÃO AO VB Visão Geral do Visual Basic.NET Conceitos Básicos Antes de codificar um programa dentro do Visual Studio

Leia mais

DESENVOLVIMENTO DE SOFTWARE AULA 06 TEORIA. Prof. Celso Candido ADS / REDES / ENGENHARIA

DESENVOLVIMENTO DE SOFTWARE AULA 06 TEORIA. Prof. Celso Candido ADS / REDES / ENGENHARIA TEORIA 1 CONTROLE CheckBox 2 Ao se executar o programa adquirimos alguma experiência prática com os objetos de entrada e mais adiante discutiremos como esses objetos podem ser utilizados com menus em um

Leia mais

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 Índice 1 - Objetivo 2 - Descrição do ambiente 2.1. Tecnologias utilizadas 2.2. Estrutura de pastas 2.3. Bibliotecas já incluídas 3 - Características gerais 4 - Criando

Leia mais

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados Tutorial Plone 4 Manutenção de Sites Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados Sumário Introdução 1 Como fazer a autenticação do usuário 1.1 Através do

Leia mais

Prof. Esp. Adriano Carvalho

Prof. Esp. Adriano Carvalho Prof. Esp. Adriano Carvalho O que é um Programa? Um arquivo contendo uma sequência de comandos em uma linguagem de programação especifica Esses comandosrespeitam regras de como serem escritos e quais

Leia mais

1 2 3 W O R K S H O P 4 5 6 W O R K S H O P 7 W O R K S H O P 8 9 10 Instruções gerais para a realização das Propostas de Actividades Para conhecer em pormenor o INTERFACE DO FRONTPAGE clique aqui 11 CONSTRUÇÃO

Leia mais

Noções de. Microsoft SQL Server. Microsoft SQL Server

Noções de. Microsoft SQL Server. Microsoft SQL Server Noções de 1 Considerações Iniciais Basicamente existem dois tipos de usuários do SQL Server: Implementadores Administradores 2 1 Implementadores Utilizam o SQL Server para criar e alterar base de dados

Leia mais

Acessando um Banco de Dados

Acessando um Banco de Dados Acessando um Banco de Dados Introdução Agora que você já está craque em JSP e já instalou seu servidor, vamos direto para a parte prática! Neste tutorial vamos aprender a acessar um banco de dados. Para

Leia mais

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova. 3.5 Páginas: Ao clicar em Páginas, são exibidas todas as páginas criadas para o Blog. No nosso exemplo já existirá uma página com o Título Página de Exemplo, criada quando o WorPress foi instalado. Ao

Leia mais

Programação para Internet Avançada. 4. Web Services. Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt

Programação para Internet Avançada. 4. Web Services. Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt Programação para Internet Avançada 4. Web Services Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt São módulos de aplicações de negócios que expõem as regras do negócio como serviços na Internet através

Leia mais

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery Agenda Regras paravariáveis Identificadores Válidos Convenção de Nomenclatura Palavras-chaves em Java Tipos de Variáveis em

Leia mais

atube Catcher versão 3.8 Manual de instalação do software atube Catcher

atube Catcher versão 3.8 Manual de instalação do software atube Catcher atube Catcher versão 3.8 Manual de instalação do software atube Catcher Desenvolvido por: Clarice Mello, Denis Marques Campos Dezembro de 2014 Sumario 1. Objetivo deste manual...3 2. Requisitos para instalação...3

Leia mais

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos.

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos. JavaScript JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos. Pode ser usada dentro do próprio arquivo HTML ou estruturada em um

Leia mais

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET I Sumário 1. Objetivo do Documento... 1 2. Início... 1 3. Cadastro de Pessoa Física... 3 3.1. Preenchimentos Obrigatórios.... 4 3.2. Acesso aos Campos

Leia mais

Dicas para usar melhor o Word 2007

Dicas para usar melhor o Word 2007 Dicas para usar melhor o Word 2007 Quem está acostumado (ou não) a trabalhar com o Word, não costuma ter todo o tempo do mundo disponível para descobrir as funcionalidades de versões recentemente lançadas.

Leia mais

Como incluir artigos:

Como incluir artigos: Como incluir artigos: O WordPress é uma ferramenta muito flexível, com muitas variações e ajustes que podem torná-lo algo muito simples e também muito sofisticado conforme os recursos que são configurados

Leia mais

Algoritmos e Programação Estruturada

Algoritmos e Programação Estruturada Algoritmos e Programação Estruturada Virgínia M. Cardoso Linguagem C Criada por Dennis M. Ritchie e Ken Thompson no Laboratório Bell em 1972. A Linguagem C foi baseada na Linguagem B criada por Thompson.

Leia mais

Como acessar o novo webmail da Educação? Manual do Usuário. 15/9/2009 Gerencia de Suporte, Redes e Novas Tecnologias Claudia M.S.

Como acessar o novo webmail da Educação? Manual do Usuário. 15/9/2009 Gerencia de Suporte, Redes e Novas Tecnologias Claudia M.S. Como acessar o novo webmail da Educação? Manual do Usuário 15/9/2009 Gerencia de Suporte, Redes e Novas Tecnologias Claudia M.S. Tomaz IT.002 02 2/14 Como acessar o Webmail da Secretaria de Educação? Para

Leia mais

JAVA NETBEANS PGOO Prof. Daniela Pires Conteúdo

JAVA NETBEANS PGOO Prof. Daniela Pires Conteúdo Conteúdo Estruturas de repetição (loops, laços)... 2 WHILE (enquanto)... 2 DO... WHILE (faça... enquanto)... 2 FOR... 3 FOREACH... 4 EXERCICIO LOOP FOR... 4 Novo Projeto... 5 Controles SWING... 10 1 Estruturas

Leia mais

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo. Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto

Leia mais

Smart Laudos 1.9. A Forma Inteligente de Criar seus Laudos Médicos. Manual do Usuário

Smart Laudos 1.9. A Forma Inteligente de Criar seus Laudos Médicos. Manual do Usuário Smart Laudos 1.9 A Forma Inteligente de Criar seus Laudos Médicos Manual do Usuário Conteúdo 1. O que é o Smart Laudos?... 3 2. Características... 3 3. Instalação... 3 4. Menu do Sistema... 4 5. Configurando

Leia mais

Criando um script simples

Criando um script simples Criando um script simples As ferramentas de script Diferente de muitas linguagens de programação, você não precisará de quaisquer softwares especiais para criar scripts de JavaScript. A primeira coisa

Leia mais

Sistema de Controle de Solicitação de Desenvolvimento

Sistema de Controle de Solicitação de Desenvolvimento Sistema de Controle de Solicitação de Desenvolvimento Introdução O presente documento descreverá de forma objetiva as principais operações para abertura e consulta de uma solicitação ao Setor de Desenvolvimento

Leia mais

Universidade Federal do Mato Grosso - STI-CAE. Índice

Universidade Federal do Mato Grosso - STI-CAE. Índice CAPA Universidade Federal do Mato Grosso - STI-CAE Índice 1. Página da área administrativa... 1.1 Botões e campo iniciais... 2. Explicar como funcionam as seções... 2.1. Seções dinâmicos... 2.1.1 Como

Leia mais

Banner Flutuante. Dreamweaver

Banner Flutuante. Dreamweaver Banner Flutuante Dreamweaver Começamos com um arquivo em branco no Dreamweaver MX. Para que o banner apareça sobre a página, precisamos inserir uma camada a mais no arquivo HTML. Selecione o menu Inserir

Leia mais

O Primeiro Programa em Visual Studio.net

O Primeiro Programa em Visual Studio.net O Primeiro Programa em Visual Studio.net Já examinamos o primeiro programa escrito em C que servirá de ponto de partida para todos os demais exemplos e exercícios do curso. Agora, aprenderemos como utilizar

Leia mais

INTRODUÇÃO AO DESENVOLVIMENTO WEB

INTRODUÇÃO AO DESENVOLVIMENTO WEB INTRODUÇÃO AO DESENVOLVIMENTO WEB PROFª. M.Sc. JULIANA H Q BENACCHIO Formulários Os formulários em HTML são usados para selecionar diferentes tipos de entradas do usuário. Um formulário é uma área que

Leia mais

Cartilha. Correio eletrônico

Cartilha. Correio eletrônico Cartilha Correio eletrônico Prefeitura de Juiz de Fora Secretaria de Planejamento e Gestão Subsecretaria de Tecnologia da Informação Abril de 2012 Índice SEPLAG/Subsecretaria de Tecnologia da Informação

Leia mais

Lição 1 - Criação de campos calculados em consultas

Lição 1 - Criação de campos calculados em consultas 1 de 5 21-08-2011 22:15 Lição 1 - Criação de campos calculados em consultas Adição de Colunas com Valores Calculados: Vamos, inicialmente, relembrar, rapidamente alguns conceitos básicos sobre Consultas

Leia mais

Módulo 3936 ASP.NET. Financiado pelo FSE

Módulo 3936 ASP.NET. Financiado pelo FSE 2 EISnt Centro de Formação Profissional, Engenharia Informática e Sistemas, Novas Tecnologias, Lda Avª D. João I, nº 380/384 Soutelo 4435-208 Rio Tinto Portal Internet : www.eisnt.com E-Mail : formação@eisnt.com

Leia mais

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA FERRAMENTAS DE COLABORAÇÃO CORPORATIVA Compartilhamento de Arquivos no Google Drive Sumário (Clique sobre a opção desejada para ir direto à página correspondente) Utilização do Google Grupos Introdução...

Leia mais

Criando & Consumindo um WebService com ASP.NET 2.0 Publicado em: 25 de Agosto de 2007 Por Herman Ferdinando Arais

Criando & Consumindo um WebService com ASP.NET 2.0 Publicado em: 25 de Agosto de 2007 Por Herman Ferdinando Arais ASP.NET > WebService herman_arais@yahoo.com.br Introdução Um WebService é um componente, ou unidade lógica de aplicação, acessível através de protocolos padrões de Internet. Como componentes, esses serviços

Leia mais

Microsoft Office Outlook Web Access ABYARAIMOVEIS.COM.BR

Microsoft Office Outlook Web Access ABYARAIMOVEIS.COM.BR Microsoft Office Outlook Web Access ABYARAIMOVEIS.COM.BR 1 Índice: 01- Acesso ao WEBMAIL 02- Enviar uma mensagem 03- Anexar um arquivo em uma mensagem 04- Ler/Abrir uma mensagem 05- Responder uma mensagem

Leia mais

CONFIGURAÇÃO Cobian Backup Programa gratuito e de qualidade para realizar seus backups automáticos

CONFIGURAÇÃO Cobian Backup Programa gratuito e de qualidade para realizar seus backups automáticos CONFIGURAÇÃO Cobian Backup Programa gratuito e de qualidade para realizar seus backups automáticos Publicado em 22/08/2010 por claudioboaventura Na primeira parte do artigo instalação sobre o excelente

Leia mais

Follow-Up Acompanhamento Eletrônico de Processos (versão 3.0) Manual do Sistema. 1. Como acessar o sistema Requisitos mínimos e compatibilidade

Follow-Up Acompanhamento Eletrônico de Processos (versão 3.0) Manual do Sistema. 1. Como acessar o sistema Requisitos mínimos e compatibilidade do Sistema Índice Página 1. Como acessar o sistema 1.1 Requisitos mínimos e compatibilidade 03 2. Como configurar o Sistema 2.1 Painel de Controle 2.2 Informando o nome da Comissária 2.3 Escolhendo a Cor

Leia mais

Instalando o Internet Information Services no Windows XP

Instalando o Internet Information Services no Windows XP Internet Information Services - IIS Se você migrou recentemente do Windows 95 ou 98 para o novo sitema operacional da Microsoft Windows XP, e utilizava antes o Personal Web Server, deve ter notado que

Leia mais

Microsoft Visual Studio Express 2012 for Windows Desktop

Microsoft Visual Studio Express 2012 for Windows Desktop Microsoft Visual Studio Express 2012 for Windows Desktop Apresentação da ferramenta Professor: Danilo Giacobo Página pessoal: www.danilogiacobo.eti.br E-mail: danilogiacobo@gmail.com 1 Introdução Visual

Leia mais

Google Drive. Passos. Configurando o Google Drive

Google Drive. Passos. Configurando o Google Drive Google Drive um sistema de armazenagem de arquivos ligado à sua conta Google e acessível via Internet, desta forma você pode acessar seus arquivos a partir de qualquer dispositivo que tenha acesso à Internet.

Leia mais

15. OLHA QUEM ESTÁ NA WEB!

15. OLHA QUEM ESTÁ NA WEB! 7 a e 8 a SÉRIES / ENSINO MÉDIO 15. OLHA QUEM ESTÁ NA WEB! Sua home page para publicar na Internet SOFTWARES NECESSÁRIOS: MICROSOFT WORD 2000 MICROSOFT PUBLISHER 2000 SOFTWARE OPCIONAL: INTERNET EXPLORER

Leia mais

15/8/2007 Gerencia de Tecnologia da Informação Claudia M.S. Tomaz

15/8/2007 Gerencia de Tecnologia da Informação Claudia M.S. Tomaz 15/8/2007 Gerencia de Tecnologia da Informação Claudia M.S. Tomaz MANUAL DE UTILIZAÇÃO DO WEBMAIL GETEC 01 2/13 Como acessar o Webmail da Secretaria de Educação? Para utilizar o Webmail da Secretaria de

Leia mais

Manual do Painel Administrativo

Manual do Painel Administrativo Manual do Painel Administrativo versão 1.0 Autores César A Miggiolaro Marcos J Lazarin Índice Índice... 2 Figuras... 3 Inicio... 5 Funcionalidades... 7 Analytics... 9 Cidades... 9 Conteúdo... 10 Referência...

Leia mais

WEBDESIGN. Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br http://www.paulotrentin.com.br Escola CDI de Videira

WEBDESIGN. Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br http://www.paulotrentin.com.br Escola CDI de Videira WEBDESIGN Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br http://www.paulotrentin.com.br Escola CDI de Videira Formulários e JavaScript Como visto anteriormente, JavaScript pode ser usada para

Leia mais

19/05/2009. Módulo 1

19/05/2009. Módulo 1 ASP.NET Módulo 1 Objetivo Mostrar os conceitos fundamentais da plataforma Microsoft.Net e suas ferramentas; Apresentar os conceitos fundamentais de aplicações web e seus elementos; Demonstrar de forma

Leia mais

Microsoft Access XP Módulo Um

Microsoft Access XP Módulo Um Microsoft Access XP Módulo Um Neste primeiro módulo de aula do curso completo de Access XP vamos nos dedicar ao estudo de alguns termos relacionados com banco de dados e as principais novidades do novo

Leia mais

Manual Captura S_Line

Manual Captura S_Line Sumário 1. Introdução... 2 2. Configuração Inicial... 2 2.1. Requisitos... 2 2.2. Downloads... 2 2.3. Instalação/Abrir... 3 3. Sistema... 4 3.1. Abrir Usuário... 4 3.2. Nova Senha... 4 3.3. Propriedades

Leia mais

Banco de Dados Microsoft Access: Criar tabelas. Vitor Valerio de Souza Campos

Banco de Dados Microsoft Access: Criar tabelas. Vitor Valerio de Souza Campos Banco de Dados Microsoft Access: Criar tabelas Vitor Valerio de Souza Campos Objetivos do curso 1. Criar uma tabela no modo de exibição Folha de Dados. 2. Definir tipos de dados para os campos na tabela.

Leia mais

MANUAL DO ANIMAIL 1.0.0.1142 Terti Software

MANUAL DO ANIMAIL 1.0.0.1142 Terti Software O Animail é um software para criar campanhas de envio de email (email Marketing). Você pode criar diversas campanhas para públicos diferenciados. Tela Principal do sistema Para melhor apresentar o sistema,

Leia mais

mkdir /srv/www/default/html/calculadora/imagens mkdir /srv/www/default/html/calculadora/blocos

mkdir /srv/www/default/html/calculadora/imagens mkdir /srv/www/default/html/calculadora/blocos Programando em PHP www.guilhermepontes.eti.br lgapontes@gmail.com Criando uma Calculadora Primeiramente deve se criar uma estrutura para armazenar os arquivos necessários para o funcionamento da calculadora.

Leia mais

ÍNDICE... 3 INTRODUÇÃO... 4. A série... 4

ÍNDICE... 3 INTRODUÇÃO... 4. A série... 4 EXCEL 2007 e 2010 2 ÍNDICE ÍNDICE... 3 INTRODUÇÃO... 4 A série... 4 01 LISTA COM VALIDAÇÃO... 5 02 FUNÇÕES FINANCEIRAS... 7 03 FUNÇÃO DE BANCO DE DADOS... 12 04 RÓTULOS... 15 05 TABELA DINÂMICA... 18 06

Leia mais

Manual SAGe Versão 1.2 (a partir da versão 12.08.01)

Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação

Leia mais

ÍNDICE. 1. Introdução...2. 2. O que é o Sistema Mo Porã...2. 3. Como acessar o Site Mo Porã...3. 4. Cadastro do Sistema Mo Porã...

ÍNDICE. 1. Introdução...2. 2. O que é o Sistema Mo Porã...2. 3. Como acessar o Site Mo Porã...3. 4. Cadastro do Sistema Mo Porã... ÍNDICE 1. Introdução...2 2. O que é o Sistema Mo Porã...2 3. Como acessar o Site Mo Porã...3 4. Cadastro do Sistema Mo Porã...4 5. Navegando no Site Mo Porã...6 5. 1 Manual de ajuda do sistema Mo Porã...7

Leia mais

Manual de E-Mail - Outlook Express

Manual de E-Mail - Outlook Express Manual de E-Mail - Outlook Express Usando o Catálogo de Endereços: 1. Clique no botão marcado como Correio na barra de ferramentas do Internet Explorer (você também pode acionar diretamente o Internet

Leia mais

COMO FUNCIONA UM FORMULÁRIO

COMO FUNCIONA UM FORMULÁRIO FORMULÁRIOS Constitui-se numa das formas de a máquina cliente enviar informações para que um programa no servidor receba estes dados, processe-os e devolva uma resposta ao usuário, por meio do navegador,

Leia mais

Manual do Publicador. Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web

Manual do Publicador. Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web Manual do Publicador Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web Sumário Painel de Administração... 3 1 - Inserção de post... 5 2 Publicação de post com notícia na área headline (galeria de

Leia mais

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item "Sites da web".

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item Sites da web. Servidor WEB Desenvolvedores de sites que querem aprender ou testar ASP, ou mesmo profissionais que precisam desenvolver páginas ASP ou ASP.Net, não precisam necessariamente ter um servidor na web com

Leia mais

Outlook 2003. Apresentação

Outlook 2003. Apresentação Outlook 2003 Apresentação O Microsoft Office Outlook 2003 é um programa de comunicação e gerenciador de informações pessoais que fornece um local unificado para o gerenciamento de e-mails, calendários,

Leia mais

Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção

Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção Este procedimento corresponde ao fluxo de trabalho de Indexação de OCR com separação de código de correção no programa de treinamento do Capture Pro Software. As etapas do procedimento encontram-se na

Leia mais

Google Drive: Acesse e organize seus arquivos

Google Drive: Acesse e organize seus arquivos Google Drive: Acesse e organize seus arquivos Use o Google Drive para armazenar e acessar arquivos, pastas e documentos do Google Docs onde quer que você esteja. Quando você altera um arquivo na web, no

Leia mais

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1 DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1 1 Sumário 1 - Instalação Normal do Despachante Express... 3 2 - Instalação do Despachante Express em Rede... 5 3 - Registrando o Despachante Express...

Leia mais

Lazarus pelo SVN Linux/Windows

Lazarus pelo SVN Linux/Windows Lazarus pelo SVN Linux/Windows Sei que não faltam artigos sobre como obter e compilar o Lazarus e o FPC pelo SVN, mas sei também que nunca é de mais divulgar um pouco mais e talvez escrever algo diferente.

Leia mais