Escolar Documentos
Profissional Documentos
Cultura Documentos
NET e C#
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.
Sobre o Autor
Sobre www.fernandoamaral.com.br
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:
Este curso foi criado dentro de minhas possibilidades, de maneira que não precisei
assumir nenhum compromisso.
ASP.NET 3.5 em VB.NET e C#
1. Introdução ao ASP.NET.................................................... 7
2. Visual Studio 2008: O ambiente e as linguagens............. 13
3. Web Forms....................................................................... 31
4. Controle............................................................................ 33
5. Master Page...................................................................... 44
6. Themes e Skins................................................................. 53
7. Navigation........................................................................ 59
8. WebParts.......................................................................... 71
10 LINQ .............................................................................. 116
11. MemberShip e Roles ..................................................... 119
12 .Manutenção de Estado................................................... 153
13 . ASP.NET AJAX ........................................................... 167
14. Criando e Consumindo WebServices ............................ 179
15. Criando uma página de erros personalizada................... 188
16. Eventos da aplicação...................................................... 191
17. Distribuindo sua Aplicação ........................................... 193
18. Relatórios com Crystal Report ...................................... 202
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.
para código em VB
para código em C#
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
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.
7
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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!
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, 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:
8
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
ASP.NET 3.5
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
Arquivos
Nesta sessão vamos ver os principais tipos de arquivos que uma aplicação ASP.NET
pode conter:
11
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
2. Visual Studio 2008: O ambiente e as linguagens
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.
12
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Comentários
No C# comentário de linha são feitos com duas barras. Comentários em bloco são
aberto com \* e fechados com *\.
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
13
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
int z;
Podemos ainda declara diversas variaveis de um mesmo tipo numa unica declaração:
int x, y, z;
Dim i as Integer = 1
int z = 1;
Const x as integer = 1
16
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
const int x = 1;
Enumeradores
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:
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
Laços
Dim i As Integer
For i = 1 To 10
MessageBox.Show(CStr(i))
Next i
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Convertendo valores
Para a conversão entre tipos de dados utilize a classe convert, seguida do método
apropriado ao tipo que ser converter:
int i;
string s;
s = Convert.ToString(i);
20
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
Um procedimento que não retorna valor em VB.NET inicia com a palavra chave Sub, e
em C# com void:
Visibilidade ou Scopo
21
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
A visibilidade de um procedimento, classe, inferface etc. é definada através das palavras
reservadas a seguir:
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.
22
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
vantagem do seu uso é redução de problemas com conflitos com nomes repetidos de
classes ou métodos.
Namespace GoodSoftware
Public Class ERP
'...
End Class
End Namespace
namespace GoodSoftware
{
public class ERP
{
//
}
}
public Class1 ()
{
//
}
24
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Public Property Nome() As String
Get
Return Pnome
End Get
Set(ByVal value As String)
Pnome = value
End Set
End Property
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:
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.
25
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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#:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
O .NET não suporta herança multipla, porém uma classe pode implementar
diversas interfaces.
Utilizando o IIS
27
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Clique em Open;
De volta a new Web Site, clique em Ok.;
29
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
</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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Abaixo veremos as principais diretivas existentes no ASP.NET 3.5:
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
diretiva @page:
31
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
32
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
<span id="Label1">Label</span>
33
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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:
End Sub
Junto com o evento são passadas duas propriedades, sender, do tipo object, que contem
o objeto que disparou o evento, e e, do tipo EventArgs, que contem algumas
propriedades especificas do evento.
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:
35
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
É definido pela a tag ASP:Label e quando executado renderizado em uma tag span:
TextBox
È 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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<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>
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.
Uma importante propriedade é a PostBackUrl, que indica para qual página será
executado o post back.
LinkButton
<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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<a id="LinkButton1"
href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>
ImageButton
HyperLInk
CheckBox
38
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
RadioButton
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.
DropDownList e ListBox
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.
39
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
DropDownList1.Items.Add("Selecione uma opção");
Para recuperar o valor da propriedade text bem como value basta ler as propriedades
específicas:
string s = DropDownList1.SelectedValue;
string t = DropDownList1.SelectedItem.Text;
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
if (CheckBoxList1.Items[0].Selected==true)
{
//
}
40
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Dim s As System.DateTime
For Each s In Calendar1.SelectedDates
ListBox1.Items.Add(String.Format("Data Selecionada {0:d}", s))
Next
41
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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.
42
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
Controles de validação
43
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
44
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
45
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Será exibida a caixa de dialogo Master Page, que exibe as Master Pages disponíveis no
projeto:
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.
49
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e _
As System.EventArgs) Handles Me.PreInit
Page.MasterPageFile = "~/MasterUm.master"
End Sub
Obviamente que esta última forma nos priva dos beneficios da herança visual.
Nesta sessão vamos demonstrar de maneira prática como tirar proveito da utilização de
uma Master Page.
50
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
51
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Defina uma das páginas de conteúdo criada como página inicial e rode a aplicação.
if (!Page.IsPostBack)
{
string s = (Master.FindControl("Desentupimento")
as HyperLink).Text;
}
52
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Também podemos alterar o texto ou mesmo qualquer propriedade do controle na Master
Page, pois nossa operação é por referencia:
HyperLink Hyper;
Hyper = (Master.FindControl("Desentupimento") as HyperLink);
Hyper.ForeColor = System.Drawing.Color.Red;
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
54
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
6. Themes e Skins
A formatação de suas páginas ASP.NET poderão ser feitas de diversas maneiras, entre
elas:
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 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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Escolha o tema Red. Nos bastidores o tema escolhido é adicionado em uma diretiva da
página:
57
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Altere o tema para Gray e rode a aplicação novamente.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Page.Theme = "red"
Page.Theme = "Red";
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Certifique-se que sua página esta utilizando o Skin Red. Rode a aplicação:
60
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
61
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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.
62
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Através da Smart Tag você também pode definir uma auto-formatação para seu
controle.
Menu
63
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Add a root item: Adiciona um novo item no mesmo nível da seleção atual
Add a child item: Adiciona um novo item um nível acima da seleção atual
Move the item down amongst its siblings: Desce o item verticalmente;
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Um controle Menu também pode fazer uso do arquivo, porém você terá que ligá-los
manualmente. É extremante simples:
65
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
TreeView
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Definidas as propriedades de cada Item, o controle esta pronto para ser utilizado.
68
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Seleção Múltipla
69
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
TreeNode node;
node = new TreeNode();
70
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
node.Text = "Móveis para escritório";
node.NavigateUrl = "moveis.aspx";
TreeView1.Nodes.Add(node);
TreeView1.CollapseAll();
Ou mesmo expandir:
TreeView1.ExpandAll;
TreeView1.ExpandAll();
72
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
WebPartManager
73
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
WebPartZone
Utilizando WebParts
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
<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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
De um duplo clique sobre o botão Catalog, no manipulador de evento criado adicione o
seguinte código:
WebPartManager mgr;
mgr = WebPartManager.GetCurrentWebPartManager(Page);
mgr.DisplayMode = mgr.SupportedDisplayModes["Catalog"];
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Arrastar controles entre as zonas. Para isto basta clicar no titulo do controle e arrastá-lo
até a posição desejada:
77
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
WebPartManager mgr;
mgr = WebPartManager.GetCurrentWebPartManager(Page);
mgr.DisplayMode = mgr.SupportedDisplayModes["Browse"];
As alterações que o usuário faz nas zonas são persistentes, voltar ao modo
normal não irá desfazê-las.
Modo Design
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Catalog, porém sem exibir o controle CatalogZone e sem possibilidade de mostrar um
controle oculto.
WebPartManager mgr;
mgr = WebPartManager.GetCurrentWebPartManager(Page);
mgr.DisplayMode = mgr.SupportedDisplayModes["Browse"];
Modo Edit
WebPartManager mgr;
mgr = WebPartManager.GetCurrentWebPartManager(Page);
mgr.DisplayMode = mgr.SupportedDisplayModes["Edit"];
79
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<webParts>
<personalization>
<authorization>
<allow users="*" roles="admin" verbs="enterSharedScope"/>
</authorization>
</personalization>
</webParts>
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
80
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
As alterações irão persistir mesmo se você fechar o navegador.
BehaviorEditorPart
82
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
83
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
SQLDataSource e GridView
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Neste exemplo você verá que é possível retornar um conjunto de dados sem escrever
sequer uma linha de código:
86
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
É 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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString
%>"
DeleteCommand="DELETE FROM [Department] WHERE [DepartmentID] =
@DepartmentID"
InsertCommand="INSERT INTO [Department] ([Name], [GroupName],
[ModifiedDate]) VALUES (@Name, @GroupName, @ModifiedDate)"
SelectCommand="SELECT * FROM [Department]" UpdateCommand="UPDATE
[Department] SET [Name] = @Name, [GroupName] = @GroupName,
[ModifiedDate] = @ModifiedDate WHERE [DepartmentID] = @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>
Marque as opções Enable Paging. Enable Sorting, Enable Editing, Enable Deleting e
Enable Selecion na Smart Tag:
90
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Obviamente se a operação de inclusão ou atualização violar alguma regra de
integridade do banco de dados, será gerado um erro.
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.
DataSourceMode
ConnectionString
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
93
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
Editando Colunas
95
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
A área de edição de colunas é dividida em três partes.
96
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
98
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
FormView
99
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Abaixo você pode observar os templates que formam o FormsView. Cada um deles
pode ser configurado de acordo com sua funcionalidade.
100
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
102
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
103
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<asp:ListView ID="ListView1" runat="server"
DataSourceID="SqlDataSource1">
</asp:ListView>
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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 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.
108
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Vamos ver as principais classes do ADO.NET
SQLConnection
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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()
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.
111
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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)
SQLDataReader
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:
112
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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();
Parâmetros
114
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
seguida atribuímos um valor ao parâmetro, e finalmente o adicionamos a coleção de
parâmetros do comando.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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 e finalmente
invocamos o método Update do Adapter para atualizar a fonte de dados:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
118
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
Abra o Server Explorer, conecte com o banco de dados que irá utilizar, expanda a pasta
Tables:
119
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
121
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Rode a aplicação e note que você pode navegar livremente entre os formulários.
Preparando o Arquivo web.config
123
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Para definir autenticação Forms devemos fazer algumas alterações no arquivo
web.config como no exemplo abaixo:
<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>
Você foi redirecionado para a página login.aspx, pois é a página definida para
autenticação em nosso arquivo de configuração.
124
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Na URL, o ASP.NET adicionou a página inicial solicitada, de forma que você possa ser
redirecionado automaticamente após a autenticação
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.
<location path="NovoUsuario.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Por padrão, a senha deve conter no mínimo 7 caracteres, sendo no mínimo um caractere
não alfanumérico ( # por exemplo).
126
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
129
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Criando um atalho para Login ou Logout com LoginStatus
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.
130
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
133
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Para testar o controle primeiro você precisa informar um servidor smtp em seu arquivo
web.config, a fim de enviar o e-mail, 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>
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Em seguida, deve responder a pergunta secreta cadastrada durante o login:
135
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Se tudo correr bem, a aplicação informa que o e-mail foi enviado:
136
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Ok, agora é só abrir o e-mail. 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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Deve ser único, ou seja, nenhum hash gerado a partir de uma informação diferente deve
ser igual a outro qualquer.
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.
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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).
140
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
141
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Classe MemberShipUser
Autorização e Funções
Definir que nossa página administracao.aspx só poderá ser acessada por um usuário
pertencente a função admin.
Testar a aplicação.
<roleManager enabled="True"/>
142
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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 (!Page.IsPostBack)
{
ListBox1.DataSource = Membership.GetAllUsers();
ListBox1.DataBind();
Roles_DataBind();
}
143
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Criando um controle de atribuição de funções a usuários
145
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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);
ListBox3.DataSource =
Roles.GetRolesForUser(ListBox1.SelectedItem.Text)
ListBox3.DataBind()
146
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
ListBox3.DataSource =
Roles.GetRolesForUser(ListBox1.SelectedItem.Text);
ListBox3.DataBind();
147
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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>
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="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<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 from="fulano@portal.com">
<network
host="smtp.portal.com"
port="25"
userName="user"
password="123" />
</smtp>
</mailSettings>
</system.net>
</configuration>
149
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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!
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:
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.
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\v2.0.50727 , 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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Na segunda etapa devemos informar se desejamos preparar nossa aplicação ou remover
as configurações, obviamente vamos optar pela primeira opção:
152
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Em seguida um sumário das configurações é exibido:
153
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Gerando um Script
Por exemplo, para gerarmos um script com toda a funcionalidade para um arquivo de
nome ASPScript.SQL, basta executar o seguinte comando:
ASPNET_REGSQL -?
155
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
</membership>
<connectionStrings>
<add name="MinhaString" connectionString="Data
Source=Servidor;Initial Catalog= AdventureWorks;User
ID=sa;Password=123" providerName="System.Data.SqlClient"/>
</connectionStrings>
156
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
<profile>
<properties>
<add name="Nome"/>
</properties>
</profile>
Ao final deste capitulo você pode encontrar o web.config na sua versão final.
Profile.Nome = TextBox1.Text
Response.Redirect("Final.aspx")
Profile.Nome = TextBox1.Text;
Response.Redirect("Final.aspx");
Label1.Text = Profile.Item("Nome")
Note que o qualquer propriedade que você definir no profile estará disponível no
intellisense:
158
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Turbinando a propriedade
<profile>
<properties>
<add name="Nome" type="System.String" defaultValue="Anônimo" />
</properties>
</profile>
Definindo Grupos
<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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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");
160
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
Session("Nome") = TextBox1.Text
Response.Redirect("Final.aspx")
161
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Session["Nome"] = TextBox1.Text;
Response.Redirect("Final.aspx");
Label1.Text = Session("Nome")
Label1.Text = Session["Nome"];
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
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:
QueryString
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.
163
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
& TextBox2.Text)
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.
Application
164
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Application("Nome") = TextBox1.Text
Application["Nome"] = TextBox1.Text;
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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?
Output Caching
Label1.Text = DateTime.Now.ToString
Label1.Text = DateTime.Now.ToString();
166
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<%@ OutputCache Duration="30" VaryByParam="Codigo" %>
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
Substitution
167
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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";
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
170
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
172
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
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.
Na web form criado pelo Visual Studio, adicione um controle ScriptManager. Este
controle deve ser o primeiro da página.
<div>
174
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
<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.
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:
175
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
{
System.Threading.Thread.Sleep(1000);
Label2.Text = DateTime.Now.ToString();
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
177
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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! :
178
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
179
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Usando um Timer
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:
181
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
182
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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.
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.
Para criar um Web Service, vá em New Web Site, e selecione ASP.NET Web Service.
183
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data
Imports System.Data.SqlClient
<WebService(Namespace:="http://tempuri.org/")> _
<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 = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
[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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
return Data;
}
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Em Web reference name mantenha o nome sugerido e clique em Add Rererence:
Imports System.Data.SqlClient
Imports System.Data
Imports localhost.Service
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
using localhost;
191
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
192
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
<customErrors defaultRedirect="Erro.aspx"
mode="RemoteOnly">
<error statusCode="500"
redirect="Erro.aspx"/>
</customErrors>
193
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
No exemplo abaixo, cada vez que uma sessão inicia, uma variável de aplicação é
incrementada e decrementada quando a sessão termina:
195
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
}
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
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:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Ao autorizar a habilitação de depuração, seu web.config é alterado:
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:
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.
198
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
O primeiro passo é apontar o destino, para isso clique em Connect. Neste exemplo
escolhi uma pasta local em meu comutador:
199
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
201
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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.
O que você fez foi criar um instalador sem praticamente qualquer configuração, mas as
opções que você tem são enormes.
204
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Existem ainda diversos editores que podem ser acessados através do solution explorer,
são eles:
205
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
18. Relatórios com Crystal Report
Nesta sessão vamos aprender a criar alguns relatórios básicos com Crystal Report
Clique com o botão direito sobre a aplicação, selecione Add New Item. Na caixa de
dialogo selecione Crystal Report:
206
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
No Fields Explorer, clique em Database Fields com botão direito e selecione Database
Expert.
207
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
Expanda Create New Connection e selecione OLE DB(ADO):
209
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
De volta ao DataBase Fiedls, expanda o nó da tabela, arraste os campos para a sessão
detais de seu relatório:
211
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br
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:
Rode a aplicação.
212
ASP.NET 3.5 em VB.NET e C#
Copyright©2008, Fernando Amaral. Todos os direitos reservados. Este documento é protegidos por direitos autorais e
outros direitos de propriedade intelectual. www.fernandoamaral.com.br