Uma boa dica para quem esta desenvolvendo websites em ASP.Net e pretende que seu projeto esteja bem posicionado nos mecanismos de busca é utilizar técnicas de Search Engine Optimization, ou simplesmente SEO.

Vou dar uma dica rápida de como você pode por exemplo, alterar um pouco a estrutura de navegação do seu projeto para ganhar muitas posições nos buscadores. Primeiramente precisamos criar um roteamento de requisições no servidor para eliminar URLs fracas semânticamente, como por exemplo: ~/noticias.aspx?codnoticia=12 e converter em algo como ~/noticias/muito-legal-programar-em-aspnet. Ou seja, ao inves da URL conter apenas o código da notícia nós podemos apresentar o título da matéria e ganhar mais “relevância” nos buscadores.

O meu vídeo na Copa Microsoft de Talentos foi sobre esse assunto, por isso vou deixar para vocês o link do mesmo, e não vou adentrar muito nesta etapa. ok?

UrlRouting com VS2010 – André Paulovich from André Paulovich on Vimeo.

Porém, mesmo depois que nós temos o roteamente pronto, nós ainda temos que dar um jeito de criar as URLs referentes ao conteúdo de acordo com os títulos. E é aí que entra a segunda parte da dica. Nós temos uma forma muito fácil de converter um texto cheio de caracteres especiais (que não podem ser usados em URLS), em um texto equivalente, que será compreendido tanto pelos buscadores como por nós que vamos lê-los.

Digamos que nossa notícia tenha o título: “É hoje o último dia da competição de pacman”. Nós não podemos simplesmente colocar em caixa baixa o texto e eliminar os espaços, pois os acentos, cedilhas e etc continuariam avalhando as URLs. Por isso a melhor maneira é usando a tabela ASCII. São dois passos:

  1. Precisamos de um array com os bytes do texto original (até aqui 8bits de informação por byte):
    byte[] b = Encoding.GetEncoding(1251).GetBytes(name);
  2. Depois, basta pegar o código ASCII de cada byte de texto:
    string t = Encoding.ASCII.GetString(b);

Resumindo, quando você tem os caracteres áâàã, todos possuem o mesmo código ASCII e é essa a jogada. Falta agora apenas subistituir os espaços por um traço e nós podemos então criar uma função como esta:

 
static public string GenarateAlias(string name) {
        byte[] b = Encoding.GetEncoding(1251).GetBytes(name); // 8 bit characters
        string t = Encoding.ASCII.GetString(b); // 7 bit characters
        return t.Trim().Replace(" ", "-").ToLower();
}

Agora, para não ter que ficar chamando esta função o tempo todo, nós podemos inseri-la num evento do Paulovich.Data, onInserting e onUpdating, para que este “apelido” do título seja gerado sempre que o usuário salve uma nova notícia ou atualize uma existente. Se você ainda não conhece o ciclo de vida de uma classe Persist do Paulovich.Data veja neste link um exemplo rápido.


protected override void OnInserting(object sender, System.ComponentModel.CancelEventArgs e) {
 	    Alias = GenarateAlias(Title); // O Alias é uma propriedade da classe Persist
	    base.OnInserting(sender, e); 
}   

protected override void OnUpdating(object sender, System.ComponentModel.CancelEventArgs e) {
 	    Alias = GenarateAlias(Title);
 	    base.OnUpdating(sender, e); 
}

Pronto! Você já pode utilizar o Alias da notícia para retornar a notícia desejada.