UrlRewritingNet.UrlRewrite / Global.asax – Url amigável com .NET

Posted by Leticia Verta | Posted in .NET | Posted on 08-02-2010-05-2008

1

Após um workshop genial de SEO hoje, ver um amigo fazendo ctrl+c ctrl+v de páginas só para personalizar url e etc., vem um post sobre urls amigáveis, que nada mais é que uma técnica onde reescrevemos as urls antes que o que foi solicitado seja buscado no servidor, com o propósito de ter urls bem aceitas pelos motores de buscas, além de facilitar a “navegação manual” do usuário.

Eu, pessoalmente, uso um componente open source pra fazer isso em .NET, o UrlRewritingNet.UrlRewrite (só testei com o framework 2). Pra usar é absurdamente prático!
É necessário referenciar o UrlRewritingNet.UrlRewrite na sua aplicação e depois configurar devidamente no .config como explica na documentação (adicionar uma section e um httpModule do componente, além dos redirecionamentos desejados):

<?xml version="1.0"?>
<configuration>
 
    <configSections>
      <section name="urlrewritingnet"
               requirePermission ="false"
               type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"  />
    </configSections>
 
    <appSettings />
    <connectionStrings />
 
    <urlrewritingnet
      rewriteOnlyVirtualUrls="true"
      contextItemsPrefix="QueryString"
      defaultPage = "default.aspx"
      defaultProvider="RegEx"
      xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
      <rewrites>
        <add name="rwProduto"  virtualUrl="^~/(.*)/(.*)_(.*).html"
             rewriteUrlParameter="ExcludeFromClientQueryString"
             destinationUrl="~/DetalhesProduto.aspx?categoria=$1&amp;produto=$3"
             ignoreCase="true" />
      </rewrites>
    </urlrewritingnet>
 
    <system.web>
        <compilation debug="true"></compilation>
        <authentication mode="Windows" />
        <httpModules>
          <add name="UrlRewriteModule"
               type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
        </httpModules>
    </system.web>
 
</configuration>

Reparem no redirecionamento que eu criei como exemplo …

     virtualUrl="^~/(.*)/(.*)_(.*).html"
     destinationUrl="~/DetalhesProduto.aspx?categoria=$1&amp;produto=$3"

Na url virtual eu recebo três variáveis e na de destino eu estou usando apenas 2 (o primeiro e o último), ou seja:

Pro usuário ->

www.ecommercerelaxos.com.br/celulares/celular-bonitao-mto-mais-que-barato_5394.html

$1 = celulares; $2 = celular-bonitao-mto-mais-que-barato; $3 = 5394

Pro servidor ->

www.ecommercerelaxos.com.br/DetalhesProduto.aspx?categoria=celulares&produto=5394

Eaí você trata as querystrings normalmente em DetalhesProduto. Excelente, heim?

Outro método tão simples quanto e sem precisar adicionar nada além de uma Global Application Class (.asax) e tratar a url, digamos que, como uma string. Assim você reescreve a url apenas pra chamada no servidor.

void Application_BeginRequest(object sender, EventArgs e)
{
     var httpContext = HttpContext.Current;
     var urlAmigavel = httpContext.Request.Path; 
 
     httpContext.RewritePath(String.Concat("relapsos.aspx?urlAmigavel=", urlAmigavel));
}

Além de ter o ASP.NET MVC Framework, que já trabalha com as urls bonitinhas de natureza … :P

Só queria deixar claro que pra todas as linguagens há um meio de fazer tais urls amigáveis, afinal, não há lógica em fazer um site “dinâmico” e criar as páginas na mão (?!?!?)
Caso fique alguma dúvida, fica aqui o exemplo com UrlRewritingNet.UrlRewrite e o com a Global.asax, ou entrem em contato.

Beijos! ;)

Coding Dojo .NET Architects – 30/01/2010 – São Paulo

Posted by Vinicius Quaiato | Posted in .NET, TDD | Posted on 28-01-2010-05-2008

0

Fala galera! Sábado, dia 30/01/2010 teremos um Coding Dojo, organizado pela comunidade .NET Architects.

Este Coding Dojo dará início ao grupo de Dojo do .NET Architects, que fará encontros regulares focando os dojos nas diversas linguagens e tecnologias .NET.

Local: Unip Jaguaré – São Paulo – SP
Horário: à partir das 10hs
Data: sábado, 30/01/2010

Confira o mapa do local e faça sua incrição aqui: http://dojo.dotnetarchitects.net
Totalmente gratuito!

Não existem pré-requisitos para participar, basta ter vontade e comparecer!

Saiba mais sobre Coding Dojo aqui.

Abraços, nos vemos lá!

Vinicius Quaiato – http://viniciusquaiato.com

Criação de controles dinâmicos em .NET

Posted by Leticia Verta | Posted in .NET, C#, Geral | Posted on 18-12-2009-05-2008

2

Eis uma coisa que sempre encafifava minhas idéias: criação de controles dinâmicos no .NET.
Parece simples, porém, devido ao ‘complexo’ ciclo de vida das páginas da linguagem, se torna um pouco mais chatinho.
Vamos para o exemplo … que eu usei ainda hoje, diga-se de passagem :P

Criaremos uma página com um Panel e um Button

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
    <title>Relaxos - Controles Dinâmicos</title>
  </head>
  <body>
    <form id="form1" runat="server">
    <div>
      <asp:Panel ID="pnlTeste" runat="server" />
      <asp:Button ID="btnExibir" runat="server" Text="Botãozar" onclick="btnExibir_Click" />
    </div>
    </form>
  </body>
</html>

Agora criaremos, em tempo de execução, um TextBox e um Button – e seu respectivo evento. Exibiremos o conteúdo dos controles já adicionados através do btnExibir (notem que eu já setei um evento ao botão).

private TextBox txtDinamico;
private Button btnDinamico;
 
protected void Page_Load(object sender, EventArgs e)
{
  CriarControles();
}
 
private void CriarControles()
{
  txtDinamico = new TextBox();
  pnlTeste.Controls.Add(txtDinamico);
 
  btnDinamico = new Button();
  btnDinamico.Text = "+";
  btnDinamico.Click += new EventHandler(Adicionar);
  pnlTeste.Controls.Add(btnDinamico);
}
 
void Adicionar(object sender, EventArgs e)
{
  CriarControles();
}
 
protected void btnExibir_Click(object sender, EventArgs e)
{
  StringBuilder stbConteudo = new StringBuilder();
 
  //Pegamos todos os controles do pnlTeste
  foreach (Control oControl in pnlTeste.Controls)
  {
    //E filtramos para pegar os valores apenas dos TextBox's
    if (oControl.GetType().Name == "TextBox")
      stbConteudo.Append(String.Concat("\\nControle -> ", ((TextBox)oControl).UniqueID, " - ", ((TextBox)oControl).Text));
  }
 
  Response.Write(String.Concat("alert('" , stbConteudo.ToString(), "');"));
}

Rodando (ma oe) o projeto agora, vocês verão que os controles se perdem forever. A cada PostBack os controles somem, é como se nunca tivesse sido incluso nada ali. Isso acontece porque apenas as propriedades desses controles são serializadas, o controle em si não é, ou seja, teremos que persistir esses controles na raça … então let’s go:

public partial class ControlesDinamicos : System.Web.UI.Page
{
    private TextBox txtDinamico;
    private Button btnDinamico;
    private int qtde 
    {
        get { return Session["qtde"] == null ? 0 : Convert.ToInt32(Session["qtde"]); }
        set { Session["qtde"] = value; }
    }
    private int indice = 0;
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            //Cria o primeiro controle
            CriarControles(false);
        else
        {
            //Mantém controles posteriormente criados
            for (int c = 0; c < qtde; c++)
                CriarControles(true);
        }
    }
 
    private void CriarControles(bool Persistencia)
    {
        txtDinamico = new TextBox();
        txtDinamico.ID = String.Concat("txtDinamico", indice);
        pnlTeste.Controls.Add(txtDinamico);
 
        btnDinamico = new Button();
        btnDinamico.Text = "+";
        btnDinamico.ID = String.Concat("btnDinamico", indice);
        btnDinamico.Click += new EventHandler(Adicionar);
        pnlTeste.Controls.Add(btnDinamico);
 
        indice++;
 
        if (!Persistencia)
            qtde++;
    }
 
    void Adicionar(object sender, EventArgs e)
    {
        CriarControles(false);
    }
 
    protected void btnExibir_Click(object sender, EventArgs e)
    {
        StringBuilder stbConteudo = new StringBuilder();
 
        //Pegamos todos os controles do pnlTeste
        foreach (Control oControl in pnlTeste.Controls)
        {
            //E filtramos para pegar os valores apenas dos TextBox's
            if (oControl.GetType().Name == "TextBox")
                stbConteudo.Append(String.Concat("\\nControle -> ", ((TextBox)oControl).UniqueID, " - ", ((TextBox)oControl).Text));
        }
 
        Response.Write(String.Concat("<script>alert('" , stbConteudo.ToString(), "');</script>"));
    }
}

No código acima, quando acontece a persistência (que nada mais é a recriação de novos controles), os controles mudam os ids (Ex.: existem os controles ctl01, ctl02 … PostBack … na recriação serão ctl03, ctl04, por ai vai) e mais uma vez, cadê os dados?? Pra evitar essa bagunça, setamos a identidade de cada controle e VUALÁ! :)

Bom, agora é só colocar um ajaxzinho pra ficar biito e adequar às necessidades diárias … quem quiser o código, só clicar.

[]’s

Leticia Verta, desenvolvedora aspirante em .NET rs