
Loading ...
Postado por Plinio Cruz em 6 de novembro de 2008 - ASP, Internet, Programação |
Seja o primeiro a comentar
Active Server Pages (ASPs) são páginas Web que contêm scripts executáveis no servidor em adição à mistura usual de texto e elementos de HTML (Hypertext Markup Language). Scripts executáveis no servidor – ou de servidor, como chamaremos aqui – são comandos especiais que você adiciona a páginas Web que são processados antes que as páginas sejam enviadas do servidor ao navegador de alguém que esteja visitando o seu site. Quando você digita uma URL na caixa de endereço do navegador ou clica sobre um link em uma página Web, você está solicitando a um servidor Web localizado em alguma parte para que envie um arquivo para o navegador ( às vêzes chamado um ‘cliente’) no seu computador. Se o arquivo é do tipo HTML normal, ao recebê-lo em seu computador, ele se parecerá exatamente com aquilo que está no servidor. Após o recebimento do arquivo, o seu navegador exibe seu conteúdo como uma combinação de texto, imagens e sons. No caso de um arquivo do tipo Active Server Page, o processo é parecido, exceto que há um processamento extra que ocorre antes de o servidor enviar o arquivo. Antes de fazer o envio do arquivo, o servidor Web executa todos os scripts de servidor contidos na página. Alguns desses scripts exibem a data atual, hora e outras informações. Outros processam informação que o usuário digitou em um formulário, como numa página de livro de visitas do site. Para serem distinguidas de páginas HTML normais, Active Server Pages recebem a extensão “.asp”.
O Que é Necessário Para Usar ASP
Para trabalhar com ASP você precisa ter o Personal Web Server que vem com o Windows NT Workstation e Windows 98 ou – melhor ainda – o Internet Information Server 4 (IIS) instalado no Windows NT Server. O IIS é preferível por permitir a plena utilização dos recursos de ASP, enquanto o PSW lhe oferecerá menores possibilidades de desenvolvimento. Para instalar o Personal Web Server no Windows 98, veja aqui como fazê-lo.
O que você pode fazer com Active Server Pages?
Há muitas coisas que você pode fazer com Active Server Pages. Por exemplo:
- Você pode exibir data, hora e outras informações de variadas formas.
- Você pode criar um formulário de pesquisa e solicitar às pessoas que visitam o seu site para preenchê-lo, enviar e-mails, salvar informações em um arquivo, etc
Com o que se parecem Active Server Pages?
A aparência de uma Active Server Page depende de quem ou o que a está examinando. Para o navegador Web que a recebe, uma Active Server Page parece-se tal qual uma página HTML normal. Se um visitante do seu site exibir o código fonte de uma página gerada a partir de uma Active Server Page, eis o que ele verá: uma página HTML normal. Contudo, o arquivo residente no servidor é muito diferente. Em adição ao código HTML normal, você vê scripts de servidor. Isto é o que Active Server Pages são para o servidor antes de serem processadas e remetidas em resposta uma requisição.
Com o que se parecem os scripts de servidor?
Scripts de servidor parecem-se muito com elementos da linguagem HTML. Contudo, ao invés de iniciarem e terminarem com um sinal de menor-que (<) e maior-que (>), eles costumam iniciar com <% e terminar com %>. O sinal <% é chamado de código de abertura e o sinal %> de código de fechamento. Entre estes sinais ficam os scripts de servidor. Você pode inserir scripts de servidor em qualquer parte da sua página Web – mesmo dentro de elementos HTML.
Você necessita ser um programador para entender scripts de servidor?
Há muito que você pode fazer com scripts de servidor mesmo sem saber como programar. Por esta razão, muito do que há de ajuda online sobre Active Server Pages é escrito para pessoas que estão familiarizadas com HTML, mas não são programadores de computador.
Artigo gentilmente cedido por CodeLines

Loading ...
Postado por Plinio Cruz em 30 de outubro de 2008 - ASP, Internet, Programação |
Seja o primeiro a comentar
Subrotinas
As subrotinas têm em ASP a mesma utilidade que têm em outras linguagens.
Nos próximos dois exemplos, nós perguntamos aos nossos visitantes pelos seus nomes e, dependendo da resposta, um tratamento diferente será dado à informação. A resposta será a mesma em ambos os casos, mas no segundo caso usaremos subrotinas. O uso de subrotinas é bastante útil quando há muitas instruções a serem executadas dentro de uma rotina. Desta forma nós podemos simplificar a estrutura do nosso script.
Exemplo 1
<%
varNome=request.form(“nome”)
if varNome=”Joao” then
response.write (“Ola, Joao. Como vai voce?”)
response.write (“<br> Voce sabia que me casei o mes passado?”)
else
response.write (“Ola. Como vai voce?”)
end if
%>
|
Exemplo 2
<%
varNome=request.form(“nome”)
if varNome=”Joao” then
RespostaAJoao()
else
RespostaADesconhecido()
end if
Sub RespostaAJoao()
response.write (“Ola, Joao. Como vai voce??”)
response.write (”
Voce sabia que me casei o mes passado?”)
End Sub
Sub RespostaADesconhecido()
response.write (“Ola. Como vai voce?”)
End Sub
% >
|
Para chamar uma subrotina, nós usaremos este tipo de código:
NomeRotina()
Onde NomeRotina é o nome da subrotina (é recomendável que se use um nome bastante descritivo da tarefa que a subrotina realiza para tornar mais fácil o entendimento do script). Nós podemos também passar informação à subrotina para que ela realize sua tarefa. Os dados serão fornecidos da seguinte maneira:
NomeRotina(dado1, dado2 … dadoN)
No exemplo seguinte, nós iremos fornecer dados diferentes para uma mesma subrotina dependendo do nome que o visitante informar em um formulário:
Exemplo 3
<%
varNome=request.form(“nome”)
if varNome=”Joao” then
RespostaAoVisitante(35,Maria,Curitiba)
else
if varNome=”Pedro” then
RespostaAoVisitante(33,Rosa,Porto Alegre)
else
response.write(“Quem é voce?”)
end if
end if
Sub RespostaAoVisitante(AA,BB,CC)
response.write (“Se voce tem ” & AA & ” anos, “)
response.write (“voce e casado com ” & BB & “, e”)
response.write (” voce vive em ” & CC)
End Sub
%> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Na linha 14, AA é a primeira variável a ser obtidam BB a segunda, e CC a terceira. Os valores para as três variáveis fori fornecido na mesma ordem nas linas 5 a ou 8.
O exemplo acima também mostra que subrotinas são muito úteis para evitar de se repetir o código que executa uma mesma tarefa várias vezes dentro do script, assim o script se apresenta mais organizado e menor.
Include/virtual
Server Side includes ou SSI é uma linguagem de programação muito simples, mas que também tem um número bastante limitado de instruções. Consideraremos aqui apenas uma opção que SSI nos permite usar dentro de nossos scripts ASP: include/virtual.
No próximo exemplo, usaremos a opção include de SSI em um dos nossos scripts ASP (response.asp). Este comando nos permite reunir um conjunto de instruções que estão em arquivos diferentes (Arq1.txt, Arq2.txt) e executá-las.
Exemplo 4
response.asp
|
<%
varNome=request.form(“nome”)
if varNome=”Joao” then
%>
<!–#include virtual=”/Arq1.html” –>
<% else %>
<!–#include virtual=”/Arq2.asp” –>
<%
end if %> |
Arq1.html |
Ola, Joao.<br>
Eu sei que voce tem 31 anos, é casado com Maria e que voce vive em Curitiba. |
Arq2.asp
|
<%
for i=1 to 3
response.write(varNome & “…<BR> “)
next
response.write(“Quem e voce?”)
%>
|
Neste caso, se o nome da pessoa que está visitando nossa página é João, nós iremos responder com Arq1.html. Se for outra pessoa, então executaremos algumas instruções de ASP do arquivo Arq2.asp.
O arquivo de inclusão deve ser um arquivo texto (.txt, .html, .htm, .shtml, .asp…). Embora tenhamos usado Arq1.html e Arq2.asp, o script funcionaria da mesma forma com Arq1.txt e Arq2.txt (mudando o nome dos arquivos não teria efeito algum).
Usando SSI e asp, nós podemos ter uma página secreta:
secret_page.asp
|
<% varUsuario=request.form (“usuario”)
varSenha=request.form(“senha”)
if varUsuario=”meunome” e varSenha=”minhasenha” then
%>
<!–#include virtual=”/cgi-bin/secret_info.txt” –>
<% else %>
<Form Action=secretpage.asp method=post>
varUsuario: <input type=text name=usuario size=15><BR>
varSenha: <input type=text name=senha size=15><BR>
<input type=Submit Value=Enviar>
</form>
<% end if %>
|
secret_info.txt
|
Esta e a minha informacao secreta:<BR>
Meu nome e Joao.<BR>
Meu sobrenome e Freitas.<BR>
<BR> Fim da informacao secreta
|
Neste caso é conveniente salvar o arquivo secret_info.txt no diretório cgi-bin (o arquivo .txt não será acessível aos visitantes se estiver neste diretório, mas será acessível se estiver em nosso diretório de mais alto nível).
Artigo gentilmente cedido por CodeLines

Loading ...
Postado por Plinio Cruz em 10 de outubro de 2007 - AJAX, ASP, Programação |
Seja o primeiro a comentar
Olá pessoal! Primeiramente gostaria de agradecer o grande retorno por parte dos leitores de meu último artigo, que tem enviado sugestões e até implementado mais o código. É realmente gratificante saber que meus textos estão ajudando.
Hoje irei abordar algo menos comum, mas que considero bem interessante. Iremos começar a desenvolver um Gerenciador de Arquivos em ASP.net utilizando o Magic Ajax. Este é um artigo um pouco mais avançado, e destina-se à quem tenha um mínimo conhecimento em .Net e Orientação a Objetos.
Para quem ainda não conhece o MagicAjax, ele é um framework open-source quem visa facilitar a implementação de AJAX nas aplicações ASP.net. Em junho eu escrevi um artigo aqui no iMasters falando sobre ele. Clique aqui para ler este artigo.
. Antes de mais nada, visite o link e veja o exemplo on-line:
. Ou baixe o código fonte do artigo:
Iremos utilizar um controle DataList para exibir os dados na página. Isso irá facilitar muito nossa vida.
Então vamos começar.

01. Adicionando o MagicAjax
Faça o download do MagicAjax e copie a dll para a pasta Bin do novo site. Em seguida, crie um arquivo Web.Config (ou altere o atual) com as seguintes tags:
<?xml version="1.0"?>
<configuration>
<system.web>
<customErrors mode="Off"/>
<compilation debug="false"/>
<httpModules>
<add name="MagicAjax" type="MagicAjax.MagicAjaxModule, MagicAjax"/>
</httpModules>
</system.web>
</configuration>
Isto é necessário para utilizar o MagicAjax em nossas páginas.
02. Classes do gerenciador de arquivos
Para facilitar as coisas, nossa aplicação será Orientado à Objetos.
Criaremos uma classe chamada Arquivo que irá conter os dados de cada arquivo ou pasta que será mostrada.
Iremos também criar uma classe chamada Gerenciador que será responsável por obter uma lista com os arquivos e subdiretórios de uma determinada pasta. Estas duas classes estarão no arquivo Arquivo.vb.
02.1. A Classe Arquivo
Crie um arquivo chamado Arquivo.vb e adicione o código abaixo. Essa classe contém 7 propriedades essenciais que serão utilizadas no decorrer do artigo. Apesar do nome da classe ser “Arquivo”, ela recebe tanto arquivos quanto diretórios. Para diferenciar, temos a propriedade Tipo.
Essa classe também tem uma função que diz qual será o ícone do arquivo. Coloquei os arquivos mais básicos. Você provavelmente vai querer adicionar ícones para outros tipos de arquivos, e verá que é bem fácil.
Public Class Arquivo
Private _Nome As String
Private _Caminho As String
Private _Tamanho As String
Private _Icone As String
Private _DataCriacao As Date
Private _DataAlteracao As Date
Private _Tipo As TipoArquivo
'Nome do arquivo. Ex.: imagem.jpg
Public Property Nome() As String
Get
Return _Nome
End Get
Set(ByVal value As String)
_Nome = value
End Set
End Property
'Caminho completo do arquivo. Ex.: c:\inetpub\walteram\imagem.jpg
Public Property Caminho() As String
Get
Return _Caminho
End Get
Set(ByVal value As String)
_Caminho = value
End Set
End Property
'Tamanho do arquivo em kBytes
Public Property Tamanho() As String
Get
Return _Tamanho
End Get
Set(ByVal value As String)
If IsNumeric(value) Then
'Aqui convertemos para KB.
'Você poderia dar um tratamento mais detalhado para mostrar MB, KB, GB, etc,
'de acordo com cada situação.
_Tamanho = Math.Ceiling(CInt(value) / 1024).ToString & " KB"
Else
_Tamanho = value
End If
End Set
End Property
'Ícone do arquivo
Public Property Icone() As String
Get
Return _Icone
End Get
Set(ByVal value As String)
_Icone = AcharIcone(value)
End Set
End Property
'Data da criação do arquivo
Public Property DataCriacao() As Date
Get
Return _DataCriacao
End Get
Set(ByVal value As Date)
_DataCriacao = value
End Set
End Property
'Data da última alteração do arquivo
Public Property DataAlteracao() As Date
Get
Return _DataAlteracao
End Get
Set(ByVal value As Date)
_DataAlteracao = value
End Set
End Property
'Tipo. Pode ser pasta ou arquivo
Public Property Tipo() As TipoArquivo
Get
Return _Tipo
End Get
Set(ByVal value As TipoArquivo)
_Tipo = value
End Set
End Property
'Retorna o caminho do ícone de acordo com a extensão
Private Shared Function AcharIcone(ByVal Extensao As String) As String
Select Case Extensao
Case ".gif", ".peg", ".jpe", ".jpg", ".png"
Return "images/IconesArquivos/imagem.gif"
Case ".txt"
Return "images/IconesArquivos/texto.gif"
Case ".htm", ".xml", ".xsl", ".css", ".html", ".config"
Return "images/IconesArquivos/html.gif"
Case ".mp3", ".wav", ".wma", ".au", ".mid", ".ram", ".rm", ".snd", ".asf"
Return "images/IconesArquivos/audio.gif"
Case ".zip", "tar", ".gz", ".rar", ".cab", ".tgz"
Return "images/IconesArquivos/zip.gif"
Case ".asp", ".wsh", ".js", ".vbs", ".aspx", ".cs", ".vb"
Return "images/IconesArquivos/script.gif"
Case "pasta"
Return "images/IconesArquivos/pasta.gif"
Case Else
Return "images/IconesArquivos/generico.gif"
End Select
End Function
Public Enum TipoArquivo
Arquivo
Diretorio
End Enum
End Class
02.2. A Classe Gerenciador
No mesmo arquivo, adicione o código abaixo. Esta é a classe Gerenciador. Esta classe tem dois métodos compartilhados.
A função Obter recebe o nome de uma pasta e retorna uma lista de seus arquivos e subpastas. Note que essa lista não é um simples Array. Trata-se de uma Lista do tipo arquivo, uma Collection (coleção).
Coleções são parecidos com arrays. A diferença é que as coleções possui funcionalidades muito úteis, e são ótimas para trabalhar com dados complexos. Uma coleção pode ser uma Lista (List), uma Pilha (Stack), uma Fila (Queue), etc. Neste caso, utilizamos uma Lista.
Quando a função Obter é chamada, criamos uma nova lista de subdiretórios e arquivos de uma determinada pasta. Utilizamos o namespace System.IO do .Net, que fornece operações no sistema de arquivos.
A classe também possui um procedimento chamado Ordenar. Esse método recebe uma lista de arquivos e ordena por uma determinada propriedade. Assim, podemos ordenar a lista de arquivos por Nome do arquivo, Tamanho, Data de Criação, etc.
Public Class Gerenciador
Public Shared Function Obter(ByVal Pasta As String, ByVal Ordem As String) As _ Collections.Generic.List(Of Arquivo)
'Aqui iremos criar uma Collection, baseada na classe Arquivo
Obter = New Collections.Generic.List(Of Arquivo)
'Busca todos os diretórios
Dim Item As Arquivo
For Each strPasta As String In IO.Directory.GetDirectories(Pasta)
Dim _Pasta As New IO.DirectoryInfo(strPasta)
Item = New Arquivo
Item.Caminho = _Pasta.FullName.Replace(Pasta, "")
Item.Nome = _Pasta.Name
Item.Tamanho = "-"
Item.Icone = "pasta"
Item.DataCriacao = _Pasta.CreationTime
Item.DataAlteracao = _Pasta.LastWriteTime
Item.Tipo = Arquivo.TipoArquivo.Diretorio
Obter.Add(Item)
Next
If Ordem <> "Nome" Then Ordenar(Obter, Ordem, 0)
'Busca todos os arquivos
Dim QuantPastas As Integer = Obter.Count
For Each strArquivo As String In IO.Directory.GetFiles(Pasta)
Dim _Arq As New IO.FileInfo(strArquivo)
Item = New Arquivo
Item.Caminho = _Arq.FullName.Replace(Pasta, "")
Item.Nome = _Arq.Name
Item.Tamanho = _Arq.Length.ToString
Item.Icone = _Arq.Extension
Item.DataCriacao = _Arq.CreationTime
Item.DataAlteracao = _Arq.LastWriteTime
Item.Tipo = Arquivo.TipoArquivo.Arquivo
Obter.Add(Item)
Next
If Ordem <> "Nome" Then Ordenar(Obter, Ordem, QuantPastas)
Return Obter
End Function
'Permite ordenar uma lista de arquivos por alguma propriedade
Private Shared Sub Ordenar(ByRef Lista As Generic.List(Of Arquivo), ByVal Coluna _
As String, ByVal Inicio As Integer)
Dim menor As Integer, aux As Arquivo
For i As Integer = Inicio To Lista.Count - 2
menor = i
For j As Integer = i + 1 To Lista.Count - 1
If CallByName(Lista(j), Coluna, CallType.Get) < _
CallByName(Lista(menor), Coluna, CallType.Get) Then
menor = j
End If
Next
If menor <> i Then
aux = Lista(i)
Lista(i) = Lista(menor)
Lista(menor) = aux
End If
Next
End Sub
End Class
Agora a base de nossa aplicação está pronta. O próximo passo é criar a página que irá consumir estas classes.
03. Exibindo os dados
Crie um arquivo chamado Default.aspx e adicione a marcação abaixo.
<html>
<head><title>Gerenciador de Arquivos</title></head>
<body>
<form id="form1" runat="server">
<ajax:AjaxPanel ID="AjaxPanel1" runat="server">
<asp:HiddenField ID="PastaAtual" runat="server" />
<asp:HiddenField ID="OrdemAtual" runat="server" />
<asp:DataList ID="dlArquivos" runat="server" Width="550" OnItemCommand="dlArquivos_ItemCommand">
<HeaderTemplate>
<tr>
<td width="8%"></td>
<td width="4%"><asp:CheckBox id="chkTODOS" runat="server"/></td>
<td width="4%">
<asp:ImageButton ImageUrl="images/Icones/subir.gif" ID="cmdSubir" runat="server"
OnClick="cmdSubir_Click" /></td>
<td width="28%">
<asp:LinkButton ID="ordem1" runat="server" OnClick="Ordenar" Text="Nome"
CommandName="Nome"/></td>
<td width="8%">
<asp:LinkButton ID="ordem2" runat="server" OnClick="Ordenar" Text="Tamanho"
CommandName="tamanho" /></td>
<td width="25%">
<asp:LinkButton ID="ordem3" runat="server" OnClick="Ordenar" Text="Criação"
CommandName="DataCriacao" /> </td>
<td width="25%">
<asp:LinkButton ID="ordem4" runat="server" OnClick="Ordenar" Text="Alteração"
CommandName="DataAlteracao" /></td>
</tr>
</HeaderTemplate>
<EditItemTemplate>
<asp:HiddenField ID="caminho" runat="server"
Value="<%#DirectCast(Container.DataItem, Arquivo).Caminho%>" />
<asp:HiddenField ID="tipo" runat="server"
Value="<%#DirectCast(Container.DataItem, Arquivo).Tipo%>" />
<tr>
<td>
<asp:ImageButton CommandName="renomear" id="Renomear"
ImageUrl="images/Icones/renomear.gif" runat="server" ToolTip="Renomear"/>
<asp:ImageButton CommandName="excluir" id="Excluir" ImageUrl="images/Icones/excluir.gif"
runat="server" ToolTip="Excluir" OnClientClick="javascript:return confirm('Tem certeza que deseja excluir?')"/> </td>
<td>
<asp:CheckBox ID="chkArquivo" runat="server"/></td>
<td>
<img src="<%#DirectCast(Container.DataItem,arquivo).Icone%>" /></td>
<td>
<asp:TextBox ID="txtNome" runat="server"
Text="<%#DirectCast(Container.DataItem, Arquivo).Nome%>" CssClass="input" Width="100px" />
<asp:ImageButton ID="cmdOk" runat="server" CommandName="Atualizar" Text="Ok"
ImageUrl="images/Icones/ok.gif" ToolTip="Ok"/>
<asp:ImageButton ID="cmdCancelar" runat="server" CommandName="Cancelar" Text="Cancelar"
ImageUrl="images/Icones/cancelar.gif" ToolTip="Cancelar"/>
</td>
<td class="Padd"><%#DirectCast(Container.DataItem, Arquivo).Tamanho%></td>
<td><%#DirectCast(Container.DataItem, Arquivo).DataCriacao%></td>
<td><%#DirectCast(Container.DataItem, Arquivo).DataAlteracao%></td>
</tr>
</EditItemTemplate>
<ItemTemplate>
<asp:HiddenField ID="caminho" runat="server"
Value="<%#DirectCast(Container.DataItem, Arquivo).Caminho%>" />
<asp:HiddenField ID="tipo" runat="server"
Value="<%#DirectCast(Container.DataItem, Arquivo).Tipo%>" />
<tr>
<td>
<asp:ImageButton CommandName="renomear" id="Renomear" ImageUrl="images/Icones/renomear.gif" runat="server" ToolTip="Renomear"/>
<asp:ImageButton CommandName="excluir" id="Excluir" ImageUrl="images/Icones/excluir.gif" runat="server" ToolTip="Excluir" OnClientClick="javascript:return confirm('Tem certeza que deseja excluir?')"/>
</td>
<td><asp:CheckBox onClick="desmarcar_chkTodos(this.checked)" ID="chkArquivo" runat="server"/></td>
<td><img src="<%#DirectCast(Container.DataItem,arquivo).Icone%>" /></td>
<td>
<asp:LinkButton CommandName="Abrir" ID="Abrir" runat="server" Text="<%#DirectCast(Container.DataItem, Arquivo).Nome%>"/>
</td>
<td><%#DirectCast(Container.DataItem, Arquivo).Tamanho%></td>
<td><%#DirectCast(Container.DataItem, Arquivo).DataCriacao%></td>
<td><%#DirectCast(Container.DataItem, Arquivo).DataAlteracao%></td>
</tr>
</ItemTemplate>
</asp:DataList>
</ajax:AjaxPanel>
</form>
</body>
</html>
A primeira vista, você deve ter um susto com tanto código, e tão embolado. Mas é bem simples.
Na página, temos um AjaxPanel, e dentro dele um DataList. Simples. Tudo que estiver dentro do AjaxPanel (que é um web control do MagicAjax) irá agir de forma assíncrona.
O código acima está sem estilos. No download você encontrará a página já formatada.
Cada linha do Datalist irá ter dois campos ocultos, com o nome do ítem (nome.txt) e seu tipo (arquivo|pasta).
O Datalist tem 3 seções que você deve dar atenção:
01. Header (Cabeçalho): É onde estão os links de ordenação e um botão para subir um nível nas pastas. Ele tem também um checkbox para selecionar todos.
02. EditItemTemplate: Esta seção é mostrada quando clicamos para renomear algum arquivo ou pasta.
03. ItemTemplate: Esta é a seção mais importante do datalist. É onde irão aparecer os arquivos e pastas.
A função DirectCast tem o mesmo efeito da função CType, mas faz uma conversão direta para a classe Arquivo, sendo por isso muito mais rápida.
04. Populando o Datalist
Iremos agora fazer a ligação dos dados com o datalist. Para isso, adicione o código abaixo no topo da página Default.aspx. Pra facilitar sua vida o código está bastante comentado.
<%@ Page Language="VB" ResponseEncoding="ISO-8859-1" culture="pt-BR"%>
<%@ Assembly Src="Arquivo.vb" %>
<%@ Import Namespace="Arquivo" %>
<%@ Register Assembly="MagicAjax" Namespace="MagicAjax.UI.Controls" TagPrefix="ajax" %>
<script runat="server">
'Aqui iremos definir à partir de qual pasta o usuário tem acesso
'Neste caso, eu usei uma pasta sugestivamente chamada 'Aquivos que o usuário pode mexer'
Private PastaBase As String = "Aquivos que o usuário pode mexer"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'Quando a página é carregada pela
'primeira vez abre na pasta base
If Not Page.IsPostBack Then
Bind(PastaBase, "Nome")
End If
End Sub
Protected Sub Ordenar(ByVal sender As Object, ByVal e As System.EventArgs)
'Quando o usuário clica em algum link de ordenação
Bind(PastaAtual.Value, DirectCast(sender, LinkButton).CommandName)
End Sub
Protected Sub cmdSubir_Click(ByVal sender As Object, ByVal e As _ System.Web.UI.ImageClickEventArgs)
'Sobe um nível Bind(IO.Directory.GetParent(Server.MapPath(PastaAtual.Value)).FullName.Replace(Server.MapPath(".") & "\", "").Replace(Server.MapPath("."), ""), OrdemAtual.Value)
End Sub
Protected Sub Bind(ByVal Pasta As String, ByVal Ordem As String)
'Esta rotina fará a ligação dos dados do Repeater.
'Aqui certificamos que um usuário esperto não tentará ir para um diretório
'acima da pasta base
If Not Server.MapPath(Pasta).Contains(PastaBase) Then Pasta = PastaBase
PastaAtual.Value = Pasta
OrdemAtual.Value = Ordem
Try
dlArquivos.DataSource = Gerenciador.Obter(Server.MapPath(Pasta), Ordem)
Catch
dlArquivos.DataSource = Gerenciador.Obter(Server.MapPath(PastaBase), Ordem)
End Try
dlArquivos.DataBind()
End Sub
Protected Sub dlArquivos_ItemCommand(ByVal source As Object, ByVal e As _ System.Web.UI.WebControls.DataListCommandEventArgs)
If e.Item.ItemType = ListItemType.Item Or _
e.Item.ItemType = ListItemType.AlternatingItem Or _
e.Item.ItemType = ListItemType.EditItem Then
'Ocorre quando o usuário clica nos botões Abrir, Renomear, Excluir, Ok ou Cancelar
Dim Caminho As String = DirectCast(e.Item.FindControl("caminho"), HiddenField).Value
Dim Tipo As Arquivo.TipoArquivo = CDbl(DirectCast(e.Item.FindControl("tipo"), _
HiddenField).Value)
Select Case e.CommandName.ToLower
Case "abrir"
If Tipo = TipoArquivo.Diretorio Then
Bind(PastaAtual.Value & "\" & Caminho, OrdemAtual.Value)
Else
Response.Redirect("download.aspx?arquivo=" & _
Server.MapPath(PastaAtual.Value & "\" & Caminho).Replace("\", "\\"))
End If
Case "renomear"
dlArquivos.EditItemIndex = e.Item.ItemIndex
Bind(PastaAtual.Value, OrdemAtual.Value)
Case "excluir"
If Tipo = TipoArquivo.Diretorio Then
IO.Directory.Delete(Server.MapPath(PastaAtual.Value & "\" & Caminho))
Else
IO.File.Delete(Server.MapPath(PastaAtual.Value & "\" & Caminho))
End If
Bind(PastaAtual.Value, OrdemAtual.Value)
Case "atualizar" 'ok
Try
If DirectCast(e.Item.FindControl("txtNome"), TextBox).Text.Trim <> "" And Server.MapPath(PastaAtual.Value & "\" & DirectCast(e.Item.FindControl("txtNome"), TextBox).Text) <> Server.MapPath(PastaAtual.Value & "\" & Caminho) Then
If Not IO.Directory.Exists(Server.MapPath(PastaAtual.Value & "\" & DirectCast(e.Item.FindControl("txtNome"), TextBox).Text)) And Not IO.File.Exists(Server.MapPath(PastaAtual.Value & "\" & DirectCast(e.Item.FindControl("txtNome"), TextBox).Text)) Then
If Tipo = TipoArquivo.Diretorio Then
IO.Directory.Move(Server.MapPath(PastaAtual.Value & "\" & Caminho), Server.MapPath(PastaAtual.Value & "\" & DirectCast(e.Item.FindControl("txtNome"), TextBox).Text))
Else
IO.File.Move(Server.MapPath(PastaAtual.Value & "\" & Caminho), Server.MapPath(PastaAtual.Value & "\" & DirectCast(e.Item.FindControl("txtNome"), TextBox).Text))
End If
dlArquivos.EditItemIndex = -1
Bind(PastaAtual.Value, OrdemAtual.Value)
Else
MagicAjax.AjaxCallHelper.WriteAlert("Já existe um arquivo ou pasta com esse nome!")
End If
Else
MagicAjax.AjaxCallHelper.WriteAlert("Digite o novo nome!")
End If
Catch ex As Exception
MagicAjax.AjaxCallHelper.WriteAlert("Nome de arquivo inválido!" & Chr(13) & "Um nome de arquivo não pode conter nenhum dos caracteres: \ / : * ? "" < > |")
End Try
Case "cancelar"
dlArquivos.EditItemIndex = -1
Bind(PastaAtual.Value, OrdemAtual.Value)
End Select
End If
End Sub
</script>
A função mais importante desse código todo é a função Bind que faz a ligação dos dados com o DataList.
Ligamos o DataList à função Obter, explicada anteriormente. Ou seja, ligamos ele a uma Lista do tipo Arquivo. Novidade?
Você já deve estar acostumado a ligar um datalist à um DataSet, ou a um DataReader. Na verdade, o Datalist, assim como o Datagrid ou o Repeater, permite ser ligado à praticamente qualquer coisa.
Para os programadores de ASP convencional, isso tudo deve estar parecendo loucura. Poucas linguagem para Web oferecem essa flexibilidade, e uma quantidade tão grande e tão controles. Aliás, tudo nesse artigo é novo em .Net!
No código acima também já está o código para abrir, renomear e excluir itens, e para ordenar o Datalist. Por isso é tão grande.
Quando você clica para renomear um ítem, a linha tranforma-se numa EditItemTemplate, onde você poderá alterar o nome do arquivo ou pasta.
Quando você clica para abrir uma pasta, ou subir um nível, a função Bind é chamada novamente para aquela pasta. Quando você clica no linka para abrir um arquivo, é redirecionado para a página Download.aspx, que força o download do arquivo.
05. Forçando o Download de arquivos
Para finalizar, crie uma página chamada Download.aspx e adicione o código abaixo. Esta página será responsável por forçar o download de um arquivo:
<%@ Page language="VB" %>
<script language="VB" runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'Força o download do arquivo.
'Talvez você tenha que configurar a pasta, definindo acesso
'ao usuário 'ASPNET' para poder acessar o arquivo quando estiver testando em localhost.
Try
If _ Request.QueryString("arquivo").ToString.ToLower.Contains(Server.MapPath("Aquivos que o usuário pode mexer").ToString.ToLower) Then
Dim fs As IO.FileStream
fs = IO.File.Open(Request.QueryString("arquivo"), IO.FileMode.Open)
Dim bytBytes(fs.Length) As Byte
fs.Read(bytBytes, 0, fs.Length)
fs.Close()
Response.AddHeader("Content-disposition", "attachment; filename=" & _ IO.Path.GetFileName(Request.QueryString("arquivo")))
Response.ContentType = "application/octet-stream"
Response.BinaryWrite(bytBytes)
Response.End()
End If
Catch
End Try
End Sub
</script>
No próximo artigo, você verá como apagar mais de um arquivo, mover, copiar, criar pastas e fazer upload. Enquanto isso, não deixe de implementar esse aí.
Bem pessoal, é isso.
O Código parece complicado, mas é bem simples. Não hesite em mandar e-mail para mim se tiver alguma dúvida. Infelizmente nem sempre dá responder na mesma hora, ou no mesmo dia, mas prometo ajudar. Continuem colaborando, enviando críticas, dúvidas e sugestões.
Um abraço.
Walter Amorim
Visite o site do colunista: http://www.walteram.com.br

Loading ...
Postado por Plinio Cruz em - AJAX, ASP, Programação, Tutorial |
Seja o primeiro a comentar
Olá pessoal! Neste artigo iremos abordar de forma prática um assunto muito na moda. Trata-se do AJAX. O AJAX (Asynchronous Javascript and XML) é uma metodologia antiga para acesso assíncrono a páginas Web. Ele já vem sendo utilizado arduamente há anos por programadores ASP, PHP e etc, utilizando uma mistura de JavaScript e XML.
Tentarei mostrar como ASP.Net simplifica (e muito) a implementação de AJAX em suas páginas.
Simplificando, as linguagens de programação Web (como ASP, PHP e até mesmo ASP.net) são processadas no servidor. Isso significa que cada vez que o usuário clica em um botão, a página é enviada de volta ao servidor, e recarregada. A utilização do AJAX permite que esse processamento seja assíncrono, evitando que a página seja recarregada, dando ao usuário uma sensação muito mais confortável. É uma ferramenta maravilhosa, quando bem utilizada.
O exemplo mais bem sucedido que conheço da utilização de AJAX é o Gmail. Quando você navega pelo Gmail, as páginas não são diretamente carregadas. Ao invés disso, é mostrada uma mensagem na lateral superior direita, informando que a página está sendo carregada e enquanto isso podemos continuar a usá-la.

Vamos criar uma aplicação bem simples, para inclusão, exclusão e acesso à dados de uma Lista Telefônica, com nome, cidade, e-mail e telefone. Um exemplo simples, pra que você entenda o funcionamento do Ajax.
Antes de começar, veja aqui o exemplo rodando e baixe aqui o código completo.
Irei utilizar a biblioteca MagicAjax, que, na minha opinião, é a mais fácil de usar, e é OpenSource. Você pode baixá-la em http://www.magicajax.net. Usarei o Visual Web Developer 2005 (.Net 2.0), mas nada impede que você codifique manualmente.
1 – Configurando o MagicAjax em nossa aplicação
Pois bem. Baixe o MagicAjax e copie para a pasta de sua aplicação as pastas “bin” e “core”. Na pasta bin está o arquivo MagicAjax.dll, a biblioteca que usaremos para construir nossa aplicação, e na pasta core estão os scripts usados pelo MagicAjax.
Primeiramente, temos que definir em nossa aplicação que iremos utilizar a biblioteca do MagicAjax. Isso é feito através de algumas linhas de código no Web.config.
Então, crie um arquivo chamado Web.config e neste arquivo, digite o código abaixo:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="magicAjax" type="MagicAjax.Configuration.MagicAjaxSectionHandler, MagicAjax"/>
</configSections>
<magicAjax scriptPath="~/Core/Script" outputCompareMode="HashCode" tracing="false">
<pageStore mode="NoStore" unloadStoredPage="false" cacheTimeout="5" maxConcurrentPages="5" maxPagesLimitAlert="false"/>
</magicAjax>
<system.web>
<httpModules><add name="MagicAjax" type="MagicAjax.MagicAjaxModule, MagicAjax"/>
</httpModules>
<customErrors mode="Off"></customErrors></system.web></configuration>
2 – Criando o arquivo de dados
Agora, crie o arquivo XML/XSD que irá conter nossos dados, chamado “dados.xml”. Iremos usar os dados provenientes desse arquivo. Nada impede que você use um banco de dados. No arquivo dados.xml, copie o texto abaixo:
<?xml version="1.0" standalone="yes"?>
<Content xmlns="http://tempuri.org/Content.xsd">
<xs:schema id="Content" targetNamespace="http://tempuri.org/Content.xsd" xmlns:mstns="http://tempuri.org/Content.xsd" xmlns="http://tempuri.org/Content.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="Content" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Lista">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:short" />
<xs:element name="nome" type="xs:string" minOccurs="0" default=""/>
<xs:element name="cidade" type="xs:string" minOccurs="0" default=""/>
<xs:element name="email" type="xs:string" minOccurs="0" default=""/>
<xs:element name="telefone" type="xs:string" minOccurs="0" default=""/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Lista>
<ID>1</ID>
<nome>Walter V. S. de Amorim</nome>
<cidade>Barra Mansa/RJ</cidade>
<email>nao.faca.spam@walteram.com.br</email>
<telefone>(24)9999-0000</telefone>
</Lista>
<Lista>
<ID>2</ID>
<nome>Fulano</nome>
<cidade>Volta Redonda/RJ</cidade>
<email>teste@teste.com</email>
<telefone>(21)9990-0123</telefone>
</Lista>
</Content>
Os detalhes do arquivo XML não são importantes. São apenas os dados usados por nossa aplicação.
3 – Exibindo os dados
Agora crie um arquivo chamado “default.aspx”. Essa página irá exibir os dados provenientes do arquivo XML criado, através de um DataGrid, e nos permitirá filtrar os itens.
No arquivo, copie o código abaixo:
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Register Assembly="MagicAjax" Namespace="MagicAjax.UI.Controls" TagPrefix="ajax" %>
<script runat="server">
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then CarregarDados()
End Sub
Private Sub CarregarDados()
'Cria um dataset, e lê os dados do arquivo dados.xml.
'Você poderia também carregar de um banco de dados, da
'mesma forma como está acostumado.
Dim ds As New DataSet
ds.ReadXml(Server.MapPath("dados.xml"), XmlReadMode.ReadSchema)
'Filtra os dados, se houver algum texto no campo de filtro.
ds.Tables(0).DefaultView.Ro
wFilter = "nome like '%" & txtFiltrar.Text & "%' or cidade like '%" & txtFiltrar.Text & "%'"
dg.DataSource = ds.Tables(0)
dg.DataBind()
End Sub
Private Sub dg_Command(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
If e.CommandName.ToLower = "excluir" Then
'Rotina responsável por excluir um ítem
'Pega o código do ítem
Dim IDItem As Long = e.Item.Cells(0).Text.ToString
'Cria um dataset, lê os dados e acha o ítem a apagar
Dim ds As New DataSet
ds.ReadXml(Server.MapPath("dados.xml"), XmlReadMode.ReadSchema)
ds.Tables(0).DefaultView.RowFilter = "ID=" & IDItem
'Se achar o ítem, apaga
If ds.Tables(0).DefaultView.Count > 0 Then ds.Tables(0).DefaultView.Delete(0)
'Salva o dataset no arquivo
ds.WriteXml(Server.MapPath("dados.xml"), XmlWriteMode.WriteSchema)
'Carrega os dados
CarregarDados()
ElseIf e.CommandName.ToLower = "detalhes" Then
'Abre os detalhes do ítem escolhido
Dim IDItem As Long = e.Item.Cells(0).Text.ToString
MagicAjax.AjaxCallHelper.Redirect("editar.aspx?id=" & IDItem)
End If
End Sub
Protected Sub CapturarTecla_KeyUp(ByVal sender As Object, ByVal e As MagicAjax.UI.Controls.KeyEventArgs)
'Toda vez que uma tecla for pressionada, em qualquer controle
'dentro deste container, este evento será carregado.
CarregarDados()
End Sub
</script>
<html>
<head runat="server"><title>Mostrando os Dados</title>
</head>
<body>
<form id="form1" runat="server">
<ajax:AjaxPanel ID="AjaxPanel1" runat="server">
<!--Tudo que estiver dentro do controle AjaxPanel
irá funcionar com os recursos do MagicAjax.-->
<ajax:KeyClientEventWrapper ID="CapturarTecla" runat="server" OnKeyUp="CapturarTecla_KeyUp">
<!--Dentro do AjaxPanel temos um KeyClientEventWrapper
que irá capturar todas as teclas digitadas.-->
Filtrar:
<asp:TextBox ID="txtFiltrar" runat="server"></asp:TextBox>
</ajax:KeyClientEventWrapper>
<!--Dentro do AjaxPanel temos também um DataGrid, que irá exibir os dados -->
<asp:DataGrid ID="dg" runat="server" Width="520px" AutoGenerateColumns="False" OnItemCommand="dg_Command">
<Columns>
<asp:BoundColumn DataField="Id" HeaderText="Cód." />
<asp:BoundColumn DataField="nome" HeaderText="Nome" />
<asp:BoundColumn DataField="cidade" HeaderText="Cidade" />
<asp:ButtonColumn ButtonType="LinkButton" Text="Ver + " CommandName="Detalhes" />
<asp:ButtonColumn ButtonType="LinkButton" Text="Excluir" CommandName="Excluir" />
</Columns>
</asp:DataGrid>
<br />
<a href="adicionar.aspx">
Para Adicionar um ítem, clique aqui.
</a>
</ajax:AjaxPanel>
</form></body></html>
Salve a página e execute-a. Você verá o seguinte:
Tente digitar algum texto no campo “Filtrar”. Você verá que os dados serão filtrados sem recarregar a página.
Observe também que quando você faz o filtro, ou exclui um item, aparece um pequeno quadro com o texto “Loading”, no canto superior direito, bem parecido com o que acontece com o Gmail:

Mais à frente, você verá como alterar o texto “Loading”.
O código da página, como você pode ver, não tem nada de incrível, à não ser por dois pequenos trechos. O primeiro, no início da página, é:
<%@ Register Assembly="MagicAjax" Namespace="MagicAjax.UI.Controls" TagPrefix="AJAX" %>
Nesta linha registramos os controles do MagicAjax. Assim podemos usar todos os recursos dessa biblioteca.
Um outro trecho importante:
<AJAX:AjaxPanel ID="AjaxPanel1" runat="server">
<AJAX:KeyClientEventWrapper ID="CapturarTecla" runat="server" OnKeyUp="CapturarTecla_KeyUp">
Filtrar: <asp:TextBox ID="txtFiltrar" runat="server"></asp:TextBox>
</AJAX:KeyClientEventWrapper>
<asp:DataGrid ID="dg" runat="server" Width="520px" AutoGenerateColumns="False" OnItemCommand= "dg_Command">
...
</asp:DataGrid>
</AJAX:AjaxPanel>
Neste trecho, utilizamos o AjaxPanel para controlar os eventos de nossa aplicação. Tudo que estiver dentro desse controle irá atuar sobre as regras do MagicAjax. E tudo que estiver fora do AjaxPanel, irá atuar da forma normal.
Dentro desse controle está o KeyClientEventWrapper. Este outro controle, que também vêm com a biblioteca MagicAjax, é responsável por capturar as teclas digitadas. Dentro dele temos um TextBox comum. Quando uma tecla é digitada neste TextBox, o KeyClientEventWrapper chama a função CapturarTecla_KeyUp, que carrega os dados novamente.
Dentro do AjaxPanel está também o DataGrid, que exibe os dados e permite-nos excluir um item. O DataGrid tem ainda um link para editar os dados. Essa será a próxima etapa.
Em nosso caso, usamos os controles AjaxPanel e KeyClientEventWrapper. Sugiro que você consulte a documentação do MagicAjax (disponível no download) que contém uma explicação geral de cada controle disponível na biblioteca.
Você pode ver que é bem simples implementar o AJAX em suas páginas. Tudo que tem que fazer é colocar seus controles dentro da tag AjaxPanel.
4 – Alterando os Dados da Lista Telefônica
A próxima etapa em nosso exemplo é criar a página que irá nos possibilitar a edição dos dados. Nesta, como você verá, não há nada de extraordinário.
Crie uma página chamada “editar.aspx”, e nela cole o código abaixo.
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Register Assembly="MagicAjax" Namespace="MagicAjax.UI.Controls" TagPrefix="ajax" %>
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'Carrega os dados do arquivo
If Not Page.IsPostBack Then
'Cria um dataset, e lê os dados do arquivo dados.xml.
Dim Codigo As Long = Request.QueryString("id")
Dim ds As New DataSet, dr As DataRow
ds.ReadXml(Server.MapPath("dados.xml"), XmlReadMode.ReadSchema)
'Filtra os dados
ds.Tables(0).DefaultView.RowFilter = "id =" & Codigo.ToString
'Se achar o item, coloca nos textboxes
If ds.Tables(0).DefaultView.Count > 0 Then
dr = ds.Tables(0).DefaultView.ToTable.Rows(0)
lblCodigo.Text = dr.Item("id")
txtNome.Text = dr.Item("nome")
txtCidade.Text = dr.Item("cidade")
txtEmail.Text = dr.Item("email")
txtTelefone.Text = dr.Item("telefone")
End If
End If
End Sub
Protected Sub cmdSalvar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Salva os dados no arquivo
Dim Codigo As Long = Request.QueryString("id")
Dim ds As New DataSet
ds.ReadXml(Server.MapPath("dados.xml"), XmlReadMode.ReadSchema)
For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
If ds.Tables(0).Rows(i).Item("id") = Codigo Then
ds.Tables(0).Rows(i).Item("nome") = txtNome.Text.ToString
ds.Tables(0).Rows(i).Item("cidade") = txtCidade.Text.ToString
ds.Tables(0).Rows(i).Item("email") = txtEmail.Text.ToString
ds.Tables(0).Rows(i).Item("telefone") = txtTelefone.Text.ToString
ds.WriteXml(Server.MapPath("dados.xml"), XmlWriteMode.WriteSchema)
Exit For
End If
Next
'Redireciona para a página de exibição.
'Note que usamos a função redirect própria do MagicAjax.
'Você pode usar o habitual Response.Redirect
MagicAjax.AjaxCallHelper.Redirect("default.aspx")
End Sub
Protected Sub cmdCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Ao cancelar, simplesmente redireciona para a página de exibição.
MagicAjax.AjaxCallHelper.Redirect("default.aspx")
End Sub
</script>
<html>
<head runat="server"><title>Editando os Dados</title></head>
<body>
<form id="form1" runat="server">
<table>
<tr>
<td>Código:</td>
<td><asp:Label ID="lblCodigo" runat="server"></asp:Label></td>
</tr>
<tr><td>Nome:</td>
<td><asp:TextBox ID="txtNome" runat="server" Width="245px" /></td>
</tr>
<tr><td>Cidade:</td>
<td><asp:TextBox ID="txtCidade" runat="server" /></td>
</tr>
<tr><td>E-mail:</td>
<td><asp:TextBox ID="txtEmail" runat="server" /></td>
</tr>
<tr><td>Telefone:</td>
<td><asp:TextBox ID="txtTelefone" runat="server" Width="80px" /></td>
</tr>
<tr><td></td>
<td>
<ajax:AjaxPanel ID="AjaxPanel1" runat="server">
<asp:Button ID="cmdSalvar" runat="server" OnClick="cmdSalvar_Click" Text="Salvar" />
<asp:Button ID="cmdCancelar" runat="server" Text="Cancelar" OnClick="cmdCancelar_Click" />
</ajax:AjaxPanel>
</td>
</tr>
</table>
</form></body></html>
Novamente, utilizamos o AjaxPanel. Mas, desta vez, apenas nos botões Salvar e Cancelar.
Você deve ter notado que utilizamos a função MagicAjax.AjaxCallHelper.Redirect. Esta função atua de forma quase que idêntica ao Response.Redirect, mas utiliza Ajax. A biblioteca MagicAjax possui diversas funções interessantes, como essa.
5 – Adicionando Dados à Lista
A última etapa em nossa pequena aplicação é criar a página onde poderemos adicionar dados.
Então, crie uma página chamada “adicionar.aspx” e cole o código abaixo:
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Register Assembly="MagicAjax" Namespace="MagicAjax.UI.Controls" TagPrefix="ajax" %>
<script runat="server">
Protected Sub cmdSalvar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Salva os dados no arquivo
Dim ds As New DataSet, dr As DataRow
ds.ReadXml(Server.MapPath("dados.xml"), XmlReadMode.ReadSchema)
dr = ds.Tables(0).NewRow
dr.Item("nome") = txtNome.Text.ToString
dr.Item("cidade") = txtCidade.Text.ToString
dr.Item("email") = txtEmail.Text.ToString
dr.Item("telefone") = txtTelefone.Text.ToString
ds.Tables(0).Rows.Add(dr)
ds.WriteXml(Server.MapPath("dados.xml"), XmlWriteMode.WriteSchema)
'Redireciona para a página de exibição.
'Note que usamos a função redirect própria do MagicAjax.
'Você pode usar o habitual Response.Redirect
MagicAjax.AjaxCallHelper.Redirect("default.aspx")
End Sub
Protected Sub cmdCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Ao cancelar, simplesmente redireciona para a página de exibição.
MagicAjax.AjaxCallHelper.Redirect("default.aspx")
End Sub
</script>
<html>
<head runat="server">
<title>Adicionando Dados</title>
</head>
<body>
<form id="form1" runat="server">
<table>
<tr><td>Nome:</td>
<td><asp:TextBox ID="txtNome" runat="server" Width="245px" /></td>
</tr>
<tr><td>Cidade:</td>
<td><asp:TextBox ID="txtCidade" runat="server" /></td>
</tr>
<tr><td>E-mail:</td>
<td><asp:TextBox ID="txtEmail" runat="server" /></td>
</tr>
<tr><td>Telefone:</td>
<td><asp:TextBox ID="txtTelefone" runat="server" Width="80px" /></td>
</tr>
<tr>
<td></td>
<td>
<ajax:AjaxPanel ID="AjaxPanel1" runat="server">
<asp:Button ID="cmdSalvar" runat="server" OnClick="cmdSalvar_Click" Text="Salvar" />
<asp:Button ID="cmdCancelar" runat="server" Text="Cancelar" OnClick="cmdCancelar_Click" />
</ajax:AjaxPanel>
</td>
</tr>
</table>
</form>
</body>
</html>
6 – Alterando o texto “Loading”
Conforme prometi, irei mostrar como alterar o texto “Loading”. Pois bem. Abra o arquivo “AjaxCallObject.js” (dentro da pasta core/script). Lá no final do arquivo (+- linha 1051), você verá o código:
function CreateWaitElement() {
var elem = document.getElementById('__AjaxCall_Wait');
if (!elem) {
elem = document.createElement("div");
elem.id = '__AjaxCall_Wait';
elem.style.position = 'absolute';
elem.style.height = 17;
elem.style.paddingLeft = "3px";
elem.style.paddingRight = "3px";
elem.style.fontSize = "11px";
elem.style.fontFamily = 'Arial, Verdana, Tahoma';
elem.style.border = "#000000 1px solid";
elem.style.backgroundColor = "DimGray";
elem.style.color = "#ffffff";
elem.innerHTML = 'Loading ...';
elem.style.visibility = 'hidden';
document.body.insertBefore(elem, document.body.firstChild);
}
waitElement = elem;
}
// end wait element
Altere o texto (por exemplo, para ‘Aguarde…’). Você pode também definir a cor de fundo, altura, borda, e etc.
Quando terminar, salve o arquivo e execute novamente. Pronto:

7 – Concluindo
É isso aí. Agora você está pronto pra começar a desenvolver suas próprias aplicações em Ajax.
Como você viu, tudo que tem de fazer é definir o Web.Config, registrar o MagicAjax no topo das páginas que for usar, e colocar os seus controles dentro do AjaxPanel. Simples, não?!
Nos próximos artigos irei me aprofundar mais nesse assunto tão importante. E por hoje é só. Não deixe de baixar o exemplo e brincar um pouco. E em caso de dúvidas, mande um e-mail.
Um Abraço!
Walter Amorim

Loading ...
Postado por Plinio Cruz em 5 de maio de 2005 - ASP, Banco de Dados, Programação |
Seja o primeiro a comentar
Em algumas situações em que o conteúdo de um site é atualizado constantemente, como acontece nos portais e nas empresas que oferecem a modalidade de comércio eletrônico, a criação de páginas dinâmicas é imperativa. Você já imaginou se todas as páginas de notícias on-line tivessem que ser refeitas uma a uma, no caso de atualização? Ou então, que todas as páginas contendo o preço de um determinado produto tivessem que ser atualizadas manualmente se o valor sofresse alteração? A solução para esse impasse são páginas dinâmicas que, baseadas em um banco de dados, conseguem publicar com muito mais rapidez e funcionalidade as informações atualizadas.
Uma vez tendo as informações em bases de dados, é possível criar mecanismos de procura, índices por horário de publicação, por tema, dentre outros recursos até então disponíveis somente com a replicação das informações.
Para criar tal estrutura, o primeiro passo é compreender como a informação contida em um banco de dados, de preferência relacional, poderá chegar até o navegador do usuário. O acesso às bases de dados através de páginas ASP é feito usando drivers ODBC (Object DataBase Connector). Para os programadores que já tiveram experiência com o desenvolvimento de software-cliente, o conceito é o mesmo, mas para os demais, aí vão algumas características.
O ODBC é uma interface-conector criada para a padronização de conexões a bancos de dados. Por exemplo, o fabricante que desenvolve um banco de dados proprietário e pretende inseri-lo de forma rápida no mercado, pode criar um driver ODBC que fará a tradução dos comandos padronizados da interface ODBC para os de seu gerenciador de banco de dados.
Com isso, o trabalho do programador fica muito mais simples e adaptável. Por ser bastante difundido, pode-se encontrar drivers ODBC para os mais variados tipos de bancos de dados, desde SQL Server e Oracle até Access, DBase, Paradox, etc.
A ponte entre um banco de dados, ou seu gerenciador, e a interface de programação é feita através do Data Source Name (DSN), que será o identificador desse banco dentro da linguagem de programação. Para criá-lo, é necessário ter o banco de dados modelado. No exemplo exibido, foi utilizado um banco de dados MS Access 97 contendo uma tabela com alguns campos em sua estrutura. Essa base de dados pode ser gravada em qualquer máquina da rede ou no próprio servidor Web (recomendado). Para situações mais críticas, opta-se por gerenciadores de bancos de dados como Oracle ou SQL Server e, geralmente, em servidores dedicados dentro da rede local.
A criação do DSN ODBC é fácil. Basta ir ao Painel de Controle do servidor Web no item ODBC e adicionar um novo System DSN (fonte de dados de sistema). Informe um nome único para esse DSN e aponte para o arquivo do banco de dados Access ou preencha corretamente os parâmetros necessários para os gerenciadores SQL Server, Oracle, etc. – Banco de dados noticias. mdb
Tabela – Notícias
ID – Numérico
DATA – Data/Hora
TÍTULO – Texto
CONTEÚDO – Memorando
- Configuração do DSN ODBC:
*Painel de Controle
ODBC=> System DSN
*Driver
Microsoft Access Driver (*.mdb)
*Data Source Name (DSN)
“NOTÍCIAS” Utilize o botão
*Selecionar para apontar para
o arquivo notícias.mdb
Nesse exemplo, serão criadas duas páginas dinâmicas. A primeira gera dinamicamente uma lista das últimas notícias do banco de dados ordenadas por data, de maneira decrescente. Assim, as notícias mais atuais serão listadas primeiro. Cada uma dessas notícias será exibida somente com seu título e um link para a informação completa (campo CONTEÚDO do banco de dados) na segunda página.
A página do índice não necessita receber parâmetros para que seja lida corretamente, porém a segunda página, que será responsável por exibir o conteúdo completo da notícia, receberá o ID correspondente através da URL, ou seja, o valor do ID deverá ser lido dentro do script através do método Request.QueryString(“ID”).
Para a abertura do banco de dados em ambas as páginas, não é necessário saber sua localização nem mesmo o seu formato, pois esse trabalho já é realizado pela configuração anteriormente feita durante a criação do DSN. A partir daquele momento, o banco de dados é identificado apenas pelo seu DSN, passando, se necessário, o nome do usuário e a respectiva senha.
Na prática, muitos desenvolvedores não têm acesso ao Painel de Controle do servidor Web, pois os sites estão hospedados em provedores. Para solucionar esse problema, é possível criar a conexão ODBC dinamicamente a partir da página ASP. Faça o upload do banco de dados para algum diretório do servidor Web e obtenha sua localização física (D:\ Diretorio\noticias.mdb, por exemplo). Com essa informação, basta: Substituir a linha de comando
DB.Open “Notícias”
por
DB.Open “DRIVER={Microsoft Access Driver (*.mdb)};DBQ= D:\DIR\NOTICIAS. MDB;UID=;PWD=”
Se a localização física do arquivo também não for conhecida, a solução será recorrer à função Server. MapPath() que consulta a tabela de diretórios do servidor Web e retorna a localização física de uma determinada URL. Modifique, então, a string de conexão para algo similar a:
“DRIVER={Microsoft Access Driver (*.mdb)};DBQ=” & Server.MapPath(“/”) & “\noticias.mdb” & “;pwd=”
Página CONTEUDO.ASP
<%@ LANGUAGE=VBScript%>
<html>
<%
Set DB = Server.CreateObject(“ADODB.Connection”)
DB.Open “Notícias”
If Request.QueryString(“ID”) <> “” then
SQL=”select DATA,TÍTULO,CONTEÚDO FROM NOTÍCIAS “
SQL=SQL & ” where ID=” & Request.QueryString(“ID”)
Set RecSet=DB.Execute (SQL)
If RecSet.Eof Then ‘notícia não encontrada
Response.Write “O código <b>” & Request.QueryString(“ID”) & “</b> não existe!”
Else
Response.Write “<title>Notícia – ” & RecSet(“TITULO”) & “</title>” & vbCrLf
Response.Write “<b>” & RecSet(“TÍTULO”) & “</b><BR><BR>”
Response.Write RecSet(“CONTEÚDO”)
End If
Else
Response.Write “Nenhum código de notícia informado!”
End If
%>
<hr>
<a href=”indice.asp”>Retornar ao índice de notícias</a><br>
</html>
Página INDICE.ASP
<%@ LANGUAGE=VBScript%>
<html>
<title>Índice de Notícias</title>
<%
Set DB = Server.CreateObject(“ADODB.Connection”)
DB.Open “Notícias”, “admin”, “”
SQL=”SELECT ID,DATA,TÍTULO,CONTEÚDO FROM NOTÍCIAS order by DATA DESC”
Set RecSet=DB.Execute (SQL)
If RecSet.Eof Then ‘Tabela vazia
Response.Write “Não há notícias cadastradas!”
Else
Response.Write “Clique na notícia desejada:<br><br>”
Do Until RecSet.Eof
Response.Write RecSet(“DATA”)
Response.Write ” – <a href=conteudo.asp?ID=” & RecSet(“ID”) & “>”
Response.Write RecSet(“TITULO”) & “</A><BR>”
RecSet.MoveNext
Loop
End If
%>
</html>
Dica: Para tornar a exibição do conteúdo da notícia mais requintada, utilize instruções HTML ao inserir o valor do campo CONTEÚDO no banco de dados, pois dessa forma os comandos serão enviados através da página conteudo. asp para o navegador do cliente e formatados conforme suas instruções, dando um acabamento mais profissional à página. Não se esqueça que as quebras de linha no navegador dependem da instrução HTML <br>.
Fonte: Erick Vils, PC World