Com o avanço das paginas web, seu conteúdo, ficou muito mais dinâmico, fazendo uso de script que rodam no servidor (Server-side), gerando conteúdos dinâmicos a essas paginas.
Com isso muitos desenvolvedores usam a técnica de colocar uma identificação do seu conteúdo no final da pagina, como querystring, ficando assim “http://www.meusite.com.br/pagina.aspx?id=xxxyyyzzz”.
Com isso as urls ficaram grandes demais, tornando muito difícil sua memorização, e até mesmo dificultando a indexação do site, por mecanismo de busca.
Então vamos aprender como trocar a url acima por algo do tipo “HTTP://www.meusite.com.br/carros/1/gol.aspx”, tornando muito mais amigável essa url e de fácil memorização.
Essa técnica, se chamada url amigável. Existem diversas formas de criar url amigável, usando ASP.NET Routing, urlMappings, entre outras. Vamos ao nosso exemplo.
Crie um projeto no visual Studio do tipo Asp.net Web site:
Vamos adicionar uma classe, que chamaremos de url.
Agora iremos implementar a interface IHttpModule a nossa classe url. Após sua implementação, dois métodos serão criados o Dispose e Init.
public class url:IHttpModule
{
public url() {
//
// TODO: Add constructor logic here
//
}
#region IHttpModule Members
public void Dispose()
{
throw new NotImplementedException();
}
public void Init (HttpApplication context)
{
throw new NotImplementedException();
}
#endregion
}
No método Init iremos adicionar um evento ao parâmetro context, para ser chamado após o inicio da requisição.
public void Init(HttpApplication context)
{
// adicionando um evento após iniciar uma requisição
context.BeginRequest += new EventHandler(context_BeginRequest);
}
No método Init iremos adicionar um evento ao parâmetro context, para ser chamado após o inicio da requisição.
private void context_BeginRequest(object sender, EventArgs e)
{
// pega o context da aplicação, fazendo o cast
HttpContext context = ((HttpApplication)sender).Context;
// pega a URL que está sendo requisitada
string path = context.Request.Path.Tolower();
// cria uma regex para a sua URL
// \w = qualquer caractere alfanumérico, mais underscore (_);
// \d = qualquer digito de 0 a 9; equivalente a [0-9]
Regex regex = new Regex (@"(\w+)/(\d+)/(\w+).aspx", RegexOptions.IgnorePatternWhitespace);
// recebe seus macthes, passando a URL da resquisição
MatchCollection matches = regex.Matches(path);
// se estiver ok, então terá alguns matches
if (matches.Count>0)
{
// pega o segundo grupo de matche que será nosso id
string id = matches[0].Groups[2].ToString();
// faz um case para fazero redirect
switch (matches[0].Groups[1].ToString())
{
case "carros":
Redirect (context, "carros", id);
break;
default:
break;
}
}
}
Não se esqueça de colocar o namespace do Regex para que funcione, como abaixo.
using System.Text.RegularExpressions;
Para deixar a aplicação um pouco mais organizada criamos um switch, para redirecionar nossa url a uma pagina específica, que no nosso caso é o produto carro terá um layout diferente.
Criando o método Redirect e o GetQueryString:
private static void Redirect (HttpContext context, string detalhe, string detalhe, string id)
{
// recebe o context, o id e detalhes da página específica
// faz o rewritePath
context.RewritePath(VirtualPathUtility.ToAbsolute("~") + "/" + detalhe + "/default.aspx?id=" + id + GetQueryString(context), false);
}
private static string GetQueryString(HttpContext context)
{
string query = context.Request.QueryString.ToString();
if (!string.IsNullOrEmpty(query))
return "&" + query;
return string.Empty;
}
O Método Redirect é responsável por reescrever a nova url e o método GetQueryString, por inserir algum querystring, se for necessário.
Agora vamos criar uma pasta chamada carros e um página default.aspx dentro de carro, conforme imagem abaixo:
Pegando o id da pagina carros/default.aspx:
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.QueryString["id"]))
{
string id = Request.QueryString["id"];
Response.Write("id: " + id);
}
}
Veja que, apenas estamos escrevendo o id na página, mas nesse momento podemos consultar alguma informação do banco de dados.
Vamos incluir a tag httpModules no web.config, responsável, por chamar a classe url a cada requisição.
<httpModules>
<add name="url" type="url" />
</httpModules>
Chamamos uma página que não existe e mesmo assim o httpmodule reescreveu a url.
Podemos também ao invés de passar o id no meio da url, fazer uma consulta no banco de dados pegando esse id, existem várias maneiras de se fazer isso, essa é só mais uma.