Primeiro vamos falar sobre o Response.Redirect. O código simplesmente envia uma mensagem ao navegador informando para ele mover para uma outra página ou um outro site. Simples assim. A implementação nativa dos navegadores interpreta o código e envia para o usuário. Com isso, para abrirmos uma pagina em outra janela normalmente utilizamos javascript ou hiperlinks.

Segue exemplo de javascript abaixo:



Agora faremos uma pausa na parte de chamadas a paginas e falaremos de um recurso que surgiu no C# 3.0. Os métodos de extensão. Com eles podemos adicionar métodos para tipos existentes sem criar um novo tipo derivado, recompilar ou modificar o tipo original. É um tipo especial de método estático, porém são chamados como se fossem métodos de instancia no tipo estendido. Após essa breve descrição, vamos a um exemplo bem simples para demonstrar

Criei a classe abaixo. Ela possui um único método.

 

public static class MetodosExtensao

 {

        /// 

        /// Metodo que usa a propria string como parametro para mascarar uma variavel Cpf

        /// 

        /// 

        /// Retorna uma string no formato desejado

        public static string MascaraCpf(this string pTexto)

        {

            string vRetorno = "";

            vRetorno = pTexto.Substring(0, 3) + "." + pTexto.Substring(3, 3) + "." + pTexto.Substring(6, 3) + "-" + pTexto.Substring(9, 2);

            return vRetorno;

        }

}

Agora o tipo string possui um método chamado MascaraCpf. Esse é um pequeno exemplo apenas para mostrar o que é um método de extensão. Repare na passagem do parâmetro. É importante falar que isso define o tipo que vai chamar o nosso método. Ou seja, podemos fazer algo do tipo:

String x = “12345678912”;

String v = x. MascaraCpf();

O resultado da variável v é: “123.456.789-12”.

Vamos começar a montar um método de extensão que crie uma “sobrecarga” do método Redirect.

 

public static class ResponseHelper {

    public static void Redirect(this HttpResponse response,

        string url, string target, string windowFeatures) {

 

        if ((String.IsNullOrEmpty(target) ||

            target.Equals("_self", StringComparison.OrdinalIgnoreCase)) &&

            String.IsNullOrEmpty(windowFeatures)) {

 

            response.Redirect(url);

        }

        else {

            Page page = (Page)HttpContext.Current.Handler;

            if (page == null) {

                throw new InvalidOperationException(

                    "Cannot redirect to new window outside Page context.");

            }

            url = page.ResolveClientUrl(url);

 

            string script;

            if (!String.IsNullOrEmpty(windowFeatures)) {

                script = @"window.open(""{0}"", ""{1}"", ""{2}"");";

            }

            else {

                script = @"window.open(""{0}"", ""{1}"");";

            }

 

            script = String.Format(script, url, target, windowFeatures);

            ScriptManager.RegisterStartupScript(page,

                typeof(Page), "Redirect", script, true);

        }

    }

}

Vamos as explicações do método acima.

O método é void pois não retorna nada. Nele eu faço a chamada para a pagina passada por parâmetro. O primeiro IF verifica se faço a chamada normal ou se usaremos a sobrecarga.

Após ver qual é a chamada correta de acordo com os parâmetros passado, crio meu script para criar a outra pagina.

Para utilizar o método acima basta:

Response.Redirect("popup.aspx", "_blank", "menubar=0,width=100,height=100");