Um problema muito comum de quem usa o Global.asax para reescrever a URL (Url Rewriting), para deixa-la mais amigável é que depois do postback a URL volta a ficar como era antes de ser reescrita.
Antes do postback, usando Url Rewriting:
www.site.com.br/produtos/produto-de-teste.aspx
Depois do postback
www.site.com.br/produto?id=1
Muito comum também quando temos um formulário de contato e validamos os campos no postback, ao retornar da validação, retorna a URL real.
Então para resolver isso é relativamente simples, usando essa linha de código no botão enviar:
btnSend.PostBackUrl = Request.RawUrl;
Mas como na pratica a teoria é outra, tive que criar uma função para resolver meu problema, tendo em vista que minha URL era assim:
www.site.com.br/faq/pergunta-sobre-c%23.aspx
e com o Request.RawUrl ficava assim:
www.site.com.br/faq/pergunta-sobre-c#.aspx
Solução encontrada, foi essa abaixo, onde uso o UrlEncode para codificar o que fica entre a ultima "/" e o ".aspx".
Por que apenas a parte entre "/" e o ".aspx"?
Porque se fizer com toda a URL ele ira codificar inclusive "/" e ".".
btnSend.PostBackUrl = GetRawUrl();
...
public string GetRawUrl()
{
string _return = string.Empty;
string sRawUrl = HttpContext.Current.Request.RawUrl;
if (sRawUrl.LastIndexOf("/") != -1)
{
if (sRawUrl.ToLower().LastIndexOf(".aspx") != -1)
sRawUrl = sRawUrl.Replace(".aspx", "");
_return = sRawUrl.Substring(0, sRawUrl.LastIndexOf("/") + 1) +
HttpUtility.UrlEncode(sRawUrl.Substring(sRawUrl.LastIndexOf("/") +
1,sRawUrl.Length - (sRawUrl.LastIndexOf("/") + 1)))
+ (HttpContext.Current.Request.RawUrl.ToLower()
.LastIndexOf(".aspx") != -1 ? ".aspx" : "");
}
return _return;
}