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:


<script type=”text/javascript”>

    Window.open(“yyyy.aspx”);

</script>

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

{

    /// <summary>

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

    /// </summary>

    /// <param name="pTexto"></param>

    /// <returns>Retorna uma string no formato desejado</returns>

    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");