Arquivos

Archive for janeiro \15\UTC 2010

Múltiplos uploads com asp.net + jquery

Pesquisando a respeito de como fazer múltiplos uploads em asp.net, me deparei com o um excelente tutorial em inglês: Upload Multiple Files in ASP.NET using jQuery, resolvi traduzi-lo e dar uma customizado em alguns detalhes.

Criei um web site no VS 2008 framework 2.0. No link do tutorial em inglês encontra-se os links necessários dos scripts e projetos, porem, basta clicar aqui e efetuar o download do meu projeto de exemplo que contem todos os arquivos necessários.

1 – Criei um novo web site: “File > New > Web Site …”, agora crie as seguintes pastas: imagens, img, js. Dentro da pasta js crie a pasta: multiple_upload (essa estrutura é opcional), deve ficar igual a imagem abaixo.

2 – Na pasta img adicione a imagem “deletar.gif”, na pasta multiple_upload adicione os arquivos “jquery-1.3.2.js” e “jquery.MultiFile.js”. Esses arquivos podem ser encontrados no projeto que disponibilizei para download.

3 – No arquivo Default.aspx adicione o código(explicarei sobre o código logo abaixo do mesmo):

<head runat="server">

    <title>Upload múltiplo | asp.net + jquery</title>

    <script src="js/multiple_upload/jquery-1.3.2.js" type="text/javascript"></script>
    <script src="js/multiple_upload/jquery.MultiFile.js" type="text/javascript"></script>

    <style type="text/css">
        .divUpload{height:150px; width:400px; padding:5px; overflow:auto; border:solid 1px #333333}
        .mensagem{margin:0px; height:22px}
    </style>

</head>
<body>
    <form id="form1" runat="server">

        <div class="divUpload">
            <asp:FileUpload ID="fileUp" runat="server" class="multi" />
        </div>

        <p class="mensagem">
            <asp:Label ID="lblMensagem" runat="server" Visible="false"></asp:Label>
        </p>

        <asp:Button ID="btnUpload" runat="server" Text="Upload todos" onclick="btnUpload_Click" />

    </form>
</body>

Não há nada d+ nesse código, no head colocamos as referencias para os scripts que estão na pasta “js/multiple_upload”, logo abaixo temos um pequeno css para o bloco de upload, dentro do body temos um FileUpload, um label para dizer ao usuário quantos arquivos foram adicionados e um botão para enviar os arquivos.

4 – Agora no arquivo Default.aspx.cs, vamos adicionar o evento click do botão e colocar dentro dele o código para o upload dos arquivos, deve ficar algo parecido com isso:

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        int cont = 0;
        try
        {
            HttpFileCollection hfc = Request.Files;
            for (int i = 0; i < hfc.Count; i++)
            {
                HttpPostedFile hpf = hfc[i];
                if (hpf.ContentLength > 0)
                {
                    hpf.SaveAs(Server.MapPath("~/imagens/" + hpf.FileName));
                }
                cont++;
            }

            if (cont > 0)
            {
                lblMensagem.Visible = true;
                lblMensagem.Text = cont.ToString() + " arquivos adicionados.";
            }
        }
        catch (Exception ex)
        {
            lblMensagem.Visible = true;
            lblMensagem.Text = "Ops! Algo deu errado!";
        }
    }
 

O sistema de upload funciona da seguinte maneira, toda a vez que se busca um arquivo pelo fileupload, o javascript adiciona outro controle fileupload na tela em cima do que já existe, então temos a impressão de sempre usar o mesmo fileupload. Então usamos a classe HttpFileCollection que disponibiliza acesso, como uma coleção de ficheiros, a todos os ficheiros que são transferidos. Caso a página permita a transferência de mais de um ficheiro (recorrendo a vários controles fileupload), então esta coleção pode ser percorrida para obter informação sobre cada um dos ficheiros. Já a classe HttpFileCollection Fornece Acesso a arquivos individuais que foram carregados por um cliente. Então criei um loop para percorrer a coleção de ficheiros e adicioná-los um a um na pasta “imagens”. Usamos um contador para mostrar o resultado para o usuário.

5 – Muito bem, o sistema já está pronto, agora vamos customizar um pouco as saídas dos scripts (traduzir as mensagens de inglês para português e melhorar um pouco a exibição dos arquivos adicionados). No arquivo jquery.MultiFile.js, vá até a linha de número 295, e deixe o código assim:

//CÓDIGO NOVO
         r = $('<div style="font-size: 13px; padding: 2px; text-align: left; border-bottom: solid 1px #cccccc" class="MultiFile-label"></div>'),
         v = String(slave.value || ''/*.attr('value)*/),
         a = $('<span class="MultiFile-title" title="'+MultiFile.STRING.selected.replace('$file', v)+'">'+MultiFile.STRING.file.replace('$file', v.match(/[^\/\\]+$/gi)[0])+'</span>'),
         b = $('<span> - </span><a class="MultiFile-remove" title="Remover" href="#'+MultiFile.wrapID+'"><img alt="Remover" style="border: 0px; vertical-align: bottom" width="15" height="15" src="img/deletar.gif">'+/*Remover+MultiFile.STRING.remove+'*/'</a>');

         //CÓDIGO ANTIGO
         //r = $('<div class="MultiFile-label"></div>'),
         //v = String(slave.value || ''/*.attr('value)*/),
         //a = $('<span class="MultiFile-title" title="'+MultiFile.STRING.selected.replace('$file', v)+'">'+MultiFile.STRING.file.replace('$file', v.match(/[^\/\\]+$/gi)[0])+'</span>'),
         //b = $('<a class="MultiFile-remove" href="#'+MultiFile.wrapID+'">'+MultiFile.STRING.remove+'</a>');

        // Insert label
        MultiFile.list.append(
         //CÓDIGO NOVO
         r.append(a, ' ', b)

Agora vá na linha 497:

//CÓDIGO NOVO
		STRING: {
			remove:'x',
			denied:'You cannot select a $ext file.\nTry again...',
			file:'$file',
			selected:'Arquivo selecinado: $file',//File selected:
			duplicate:'Esse arquivo ja foi selecionado.\n$file'//This file has already been selected:
		},

		//CÓDIGO ANTIGO
		//STRING: {
			//remove:'x',
			//denied:'You cannot select a $ext file.\nTry again...',
			//file:'$file',
			//selected:'File selected: $file',
			//duplicate:'This file has already been selected:\n$file'
		//},

Observe que eu comentei os códigos originais e fiz umas modificações no html gerado pelo javascript, comente a modificação e depois tire o comentário do código antigo para ver a diferença.

Bom, é isso, até o a próxima!

Paginar um DataSource em asp.net (Paginar um Repeater em asp.net)

Existem controles que já vem com uma paginação basta apenas você habilita-la ou não, como o GridView por exemplo. Mas às vezes temos a necessidade de apenas exibir informações de um banco sem que isso afeta o layout. Por exemplo, existe um site de notícias, e esse site foi estruturado em css, o estruturador preparou a lista de notícias do site usando apenas “ul” e “li” e se você optar por usar um GridView para exibir essas notícias ira gerar um serie de erros de layout, pois o GridView gera uma tabela para exibir os dados. Para esse tipo de caso seria interessante usar o Repeater, pois o mesmo não gera nenhuma estrutura de HTML, ele apenas exibi as informações do banco e repete qualquer HTML que estiver dentro de seu “ItemTemplate”. Ou seja, você tem controle total sobre o Repeater podendo modificar sua estrutura por completo, porém, ao contrário do GridView, ele não possui uma paginação “embutida” que podemos ou não habilitar por isso é preciso criar uma paginação “Não mão”.

Para isso, usa-se o “PagedDataSource”, vamos ver como ele funciona:

Obs: Esse tutorial funciona perfeitamente tanto no framework 2.0 quanto no 3.5, no caso criei a aplicação usando o framework 2.0.

1 – Abra o VS 2008, “File > New > Web Site…”.

2 – Crie um arquivo novo chamado “noticias.aspx”.

3 – Criei um banco de dados no Access para este tutorial, faça o donwload do projeto no final do tutorial para pegar o banco. Assim que estiver com o banco, coloque-o dentro da pasta App_Data. Caso não tenha essa pasta em seu diretório, clique com o botão direito em cima da solução e “Add Asp.Net Folder > App_Data” ou simplesmente adicione uma pasta com esse nome no diretório da solução.

4 – Vamos adicionar uma string de conexão para o banco, abra o web.config e adicione o código como na imagem abaixo:

<appSettings/>
<connectionStrings>
<add name="DB" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/TESTE.mdb;" providerName="System.Data.OleDb">
</add>
</connectionStrings>

5 – Na página Defaul.aspx coloque um link para a página de notícias, e na url do link coloque um querystring como na imagem abaixo (usaremos uma querystring para armazenar o valor da página):

<body>
<form id="form1" runat="server">
<a href="noticias.aspx?pagina=1">Notícias</a>
</form>
</body>

6 – Na página noticias.aspx usaremos uma estrutura de lista (“ul”,”li”) para exibir as notícias. Vai funcionar assim: Cada “li” conterá uma notícia, então usaremos o Repeater para buscar a notícia do banco e colocá-la dentro da “li”, o Repeater então repetirá esse processo para todas as notícias que forem selecionadas do banco. A paginação acontecerá através dos controles HyperLink que serão adicionados no final da página abaixo da lista de notícias. Então, na tela de notícias, monte a seguinte estrutura (importante: Não é possível editar o ItemTemplate do Repeater no modo “Design” do Visual Studio, apenas no modo “Source”):

<ul>

<asp:Repeater ID="rprNoticias" runat="server">
<ItemTemplate>

<li>

<b><%#Eval("TITULO")%></b>
<p><%#Eval("NOTICIA")%></p>

</li>

</ItemTemplate>
</asp:Repeater>
</ul>

<div>

<asp:HyperLink ID="linkAnterior" runat="server"><< Anterior</asp:HyperLink>&nbsp;
<asp:HyperLink ID="linkProximo" runat="server">Proximo >></asp:HyperLink>

</div>

7 – Agora vamos para a página noticias.aspx.cs, dentro do método “Page_Load” vamos primeiro verificar se há alguma querystring, fazendo assim:

protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["pagina"] != null)
 {
 }
}

8 – Para manipular um banco do tipo “Access” precisamos adicionar a seguinte referencia: “using System.Data.OleDb;” , e para usarmos o DataSet precisamos adicionar “using System.Data;”.

9 – Todos os códigos demonstrados abaixo devem estar dentro do comando “if” mostrado acima na parte 7. Agora vamos estabelecer a conexão com o banco e fazer o “select” das notícias:

OleDbConnection Connection = new OleDbConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
OleDbDataAdapter Adapter = new OleDbDataAdapter("SELECT * FROM NOTICIAS", Connection);

DataSet Ds = new DataSet();
Adapter.Fill(Ds, "NOTICIAS");

O construtor “OleDbConnection()” espera como parâmetro a string de conexão do banco. Lembra que colocamos a string de conexão no web.config? O código que está como parâmetro dentro do construtor “OleDbConnection()” retorna a string de conexão que está no web.config. Para utilizarmos o “ConfigurationManager” é preciso adicionar a referencia: “Using System.Configuration;”.

10 – Agora digite o código abaixo:

int paginaAtual = int.Parse(Request.QueryString["pagina"]);
PagedDataSource Pgds = new PagedDataSource();
Pgds.AllowPaging = true;
Pgds.CurrentPageIndex = (paginaAtual - 1);
Pgds.PageSize = 2;
Pgds.DataSource = Ds.Tables["NOTICIAS"].DefaultView;
rprNoticias.DataSource = Pgds;
rprNoticias.DataBind();

IMPORTANTE: O índice das páginas de um objeto “PagedDataSource” é semelhante a um índice de um array em C#, ou seja, a contagem começa do “0” (zero) porem na querystring desse exemplo tratamos como se a contagem começasse do “1”(um). Então para setarmos a página atual no “DataSouce” pegamos a querystring e subtraímos 1.

A variável “paginaAtual” pega a página atual que está em uma querystring. Logo abaixo, criamos o objeto “PagedDataSource” e configuramos o mesmo. Setamos o “AllowPaging” como true para que haja a paginação, “CurrentPageIndex” é onde pegamos e/ou setemos a página atual que é exibida, “PageSize” significa a quantidade de itens que serão exibidos por página, no banco de dados em anexo temos 6 notícias cadastradas, como optamos por exibir 2 por página, logo podemos supor que teremos três páginas cada uma exibindo duas notícias. Em seguida setamos o “DataSet” como sendo o “DataSource” do Repeater, em seguida fazemos um “DataBind” do Repeater para carregar as informações.

11 –Já temos nossa paginação pronta! Agora vamos criar uma pequena navegação com os dois HyperLinks que colocamos no final da página.

if (paginaAtual > 1)
{

linkAnterior.NavigateUrl = "noticias.aspx?pagina=" + (paginaAtual - 1).ToString();

}
else
{

linkAnterior.NavigateUrl = "noticias.aspx?pagina=1";

}
if (Pgds.IsLastPage)
{

linkProximo.NavigateUrl = "noticias.aspx?pagina=" + (Pgds.PageCount).ToString();

}
else
{

linkProximo.NavigateUrl = "noticias.aspx?pagina=" + (paginaAtual + 1).ToString();

}

O HyperLink: “linkAnterior” – Primeiro verificamos se já não estamos na primeira página, ou seja se a querystring “pagina” for menor ou igual a 1, significa que estamos na primeira página, então simplesmente desabilitamos o link, caso seja maior setamos o “NavigateUrl” com: (valor atual – 1).

HyperLink: “linkProximo” – Usamos o método “IsLastPage” do objeto “Pgds” que retorna true caso a página exibido seja a ultima. Sendo assim basta setarmos o “NavigateUrl” do linkProximo com sendo o total de páginas (Pgds.PageCount) a serem exibidos pelo DataSource, caso contrario (paginaAtual + 1).

Baixe aqui o projeto, e até o próximo artigo!

CategoriasTutoriais Tags:,

Reescrever url em asp.net (url amigável em asp.net)

Explicarei aqui uma maneira bem simples de se reescrever uma url também conhecidas como “Url’s amigáveis”. Existem inúmeras vantagens para se reescrever a url uma delas é que os buscadores, como o google, tem dificuldade de entender querystrings como “?” ou “&”, outra seria a legibilidade para o usuário que em vez de ter que memorizar alguma coisa como: “noticias.aspx?id=50&c=esporte&x=10…” vai lidar com algo como: “noticias/50/esporte/nome_da_noticia.aspx”.

1 – Estarei usando o Visual Studio 2008 porém a aplicação funcionará perfeitamente no VS 2005 e no framework 2.0. Abra o VS 2008, vá em File > New > Web Site. Escolha a linguagem C# dê um nome qualquer ao projeto e clique em “Ok”.

2 – Agora clique com o botão em cima do projeto e clique em “Add new item…”, escolha o tipo “Web Form” e de o nome de “produtos.aspx”.

3 – Abra o arquivo “Deafult.aspx” que é criado junto com o projeto e coloque o código abaixo nele:

<a href="produtos/camisas.aspx">Camisas</a><br />
<a href="produtos/calcados.aspx">Calçados</a><br />
<a href="produtos/bermudas.aspx">Bermudas</a><br />

4 – Agora abra o arquivo “produtos.aspx” crie um “label” e coloque o código abaixo no “produtos.aspx.cs”:

produtos.aspx.cs

protected void Page_Load(object sender, EventArgs e)
 {
 if (Request.QueryString["categoria"] != null)
 {
 lblCategoria.Text = Request.QueryString["categoria"];
 }
}

produtos.aspx

<asp:Label ID="lblCategoria" runat="server" Text="Label"></asp:Label>

5 – Agora clique novamente com o botão direito em cima do projeto e escolha a opção “Add new item…”, adicione um arquivo do tipo “Global Application Class”, deixe o nome como “Global.asax” mesmo, esse é um arquivo de configurações e pode apenas ter um por projeto. Abra o mesmo e coloque esse código dentro:

void Application_BeginRequest(object Sender, EventArgs e)
 {
 string originalPath = Request.Url.ToString();

 if (originalPath.Contains("produtos/camisas.aspx"))
 {
 Context.RewritePath("~/produtos.aspx?categoria=camisas");
 }
 else if (originalPath.Contains("produtos/calcados.aspx"))
 {
 Context.RewritePath("~/produtos.aspx?categoria=calcados");
 }
 else if (originalPath.Contains("produtos/bermudas.aspx"))
 {
 Context.RewritePath("~/produtos.aspx?categoria=bermudas");
 }
 }

6 – O Evento “Application_BeginRequest” é o primeiro evento a ser executado em sua aplicação, se você colocar um botão por exemplo e clicar nele, antes de qualquer coisa sua aplicação vai passar por esse evento e depois pelos outros eventos, é nele que colocamos a lógica para reescrever a url.

Clique aqui para baixar o projeto, até a próxima!

CategoriasTutoriais Tags:, ,
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.