Tag Archives: Page

ASP.NET – Redirecionando para a mesma Página

É relativamente simples fazer com que uma página ASP.NET redirecione para si mesmo, o que faz com que ela volte ao seu estado inicial, não caracterizando um “PostBack”. Existem 3 opções:

1. Response.Redirect(Request.Path);

Onde o Path retorna a url relativa da página corrente, por exemplo: /Pasta/Pagina.aspx

2. Response.Redirect(Request.RawUrl);

A diferença principal para o Path é que o RawUrl traz também todas as informações da url, incluindo a querystring, por exemplo: /Pasta/Pagina.aspx?Parametro=Valor

3. Response.Redirect(Request.Url.ToString());

Neste caso, a objeto Url da classe Uri traz informações completas sobre esta. A chamada do método ToString deste objeto traz uma string com a Url absoluta:  http://localhost/Pasta/Pagina.aspx?Parametro=Valor

Métodos simples que resolvem o problema.

Referências:

http://metadeveloper.blogspot.com/

Redirect Method

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.redirect.aspx

HttpRequest Object

http://msdn.microsoft.com/pt-br/library/system.web.httprequest.aspx

ASP.NET – Page.FindControl retornando null

O método FindControl da classe Control retorna um controle da coleção Controls da própria classe pela propriedade ID. Comumente utilizamos este método para encontrar algum controle cujo ID é passado por parâmetro ou quando o controle é gerado dinamicamente. Mais comum ainda é usá-lo para obter um controle em uma linha do GridView, tipicamente no evento RowDataBound.

O caso é que algumas vezes, mesmo sabendo que o controle existe na página, ao realizar um Page.FindControl por um ID de um controle conhecido, o método retorna null. A razão é simples. A hierarquia de controles de uma página ASP.NET faz com que os controles não fiquem relacionados diretamento à coleção de controles da página.

A figura abaixo mostra a hieraquia de controles de uma página ASP.NET no modelo WebForms:

Hierarquia de Controles de uma página ASP.NET/WebForms
Hierarquia de Controles de uma página ASP.NET/WebForms
Além dessa hierarquia, é preciso contar com o fato de que seu controle pode estar dentro de um outro do tipo “container”, como um PlaceHolder, Panel ou mesmo em um UserControl. Para resolver definitivamente o controle de encontrar um controle na sua página, é preciso fazer uma busca recursiva. Lembra do Fatorial? Pois é. A rotina abaixo faz uma busca recursiva dentro de um controle, passando o ID do controle procurado por parâmetro:

private Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    } 
 
    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null)
        {
            return t;
        }
    } 
 
    return null;
}

A chamada da função fica bem simples:

1
FindControleRecursive(this.Page, "IDdoMeuControle");

Isso resolve o problema de encontrar seu controle, mesmo tendo certeza de que ele está na página.

Nem tudo são flores

Apesar de esta parecer a solução de todos os problemas (e até é), o problema desta rotina é a performance. Apesar de não haver uma perda muito grande desta, se houver alguma outra forma de identificar o controle procurado mais diretamente e sua lógica permitir, prefira-a. Isso vai poupar um bom processamento.

Fonte: http://www.codinghorror.com/blog/archives/000307.html

Tomás

ASP.NET – Obtendo o nome da página corrente

Parace um pouco estranho, mas geralmente dá mais trabalho é obter as informações mais óbvias e básicas. Bibliotecas e mais bibliotecas fornecem informações sobre tudo, mas o básico geralmente está além do trivial.

Uma dessas informações que me forçou a uma pesquisa na web foi como obter o nome físico da página em que estava trabalhando. O nome físico mesmo, por exemplo, Default.aspx. Nada mais óbvio não?

Pois bem, a linha de código não óbvia que resolver este problema é esta:

// pega o nome do arquivo da página corrente
string pageFileName = System.IO.Path.GetFileName(HttpContext.Current.Request.FilePath);

Bom, uma vez conseguida a informação, a pergunta que fica é, onde poderíamos ou até deveríamos usá-la? Uma situação que vivi por exemplo foi a de trabalhar com o controle MultiView. Como ele se baseia em várias Views que devem ser definidas no momento de mostrar seu conteúdo, pode ser necessária uma estrutura bem montada para fazer a troca das Views, com por exemplo, via QueryString. Neste cenário, seria necessário saber o nome da página corrente para fazer o redirecionamento correto com a QueryString montada. Claro que o nome da página poderia ser informado diretamente, mas no caso de ser necessário renomear a página por qualquer motivo, seria um problema ter que lembrar de corrigir todas as strings no código que a contém.

É isso. Bom proveito!

Tomás