Response.Redirect to new window


118

Quero fazer um, Response.Redirect("MyPage.aspx")mas abri-lo em uma nova janela do navegador. Já fiz isso antes sem usar o método de script de registro JavaScript. Eu simplesmente não consigo lembrar como?

Respostas:


114

Acabei de encontrar a resposta e funciona :)

Você precisa adicionar o seguinte ao link / botão do servidor:

OnClientClick="aspnetForm.target ='_blank';"

Todo o código do meu botão se parece com:

<asp:LinkButton ID="myButton" runat="server" Text="Click Me!" 
                OnClick="myButton_Click" 
                OnClientClick="aspnetForm.target ='_blank';"/>

No OnClick do lado do servidor eu faço um Response.Redirect("MyPage.aspx");e a página é aberta em uma nova janela.

A outra parte que você precisa adicionar é corrigir o destino do formulário, caso contrário, todos os links serão abertos em uma nova janela. Para fazer isso, adicione o seguinte no cabeçalho da janela POPUP.

<script type="text/javascript">
    function fixform() {
        if (opener.document.getElementById("aspnetForm").target != "_blank") return;
        opener.document.getElementById("aspnetForm").target = "";
        opener.document.getElementById("aspnetForm").action = opener.location.href;
    }
</script>

e

<body onload="fixform()">

2
Não, pois usa javascript para alterar o destino do formulário. Em vez disso, a página seria enviada normalmente.
— Toby Mills

Além disso, você pode ter uma violação de segurança se quiser redirecionar para uma página fora do seu diretório virtual.
— Drejc,

1
De alguma forma, no meu caso não está funcionando. Estou abrindo a mesma página na nova janela e escrevendo a resposta para essa página. Mas quando mantenho o método fixform () na página-mestre, ele exibe um erro dizendo que o documento é nulo. Não tenho certeza por que está jogando ainda tentando encontrar uma solução. Embora eu tenha criado uma solução temporária usando onClientClick = "aspnetForm.target = '';" propriedade para outros botões nessa página.
— JPReddy

1
Acabei de experimentar e, em vez de OnClientClick="aspnetForm.target ='_blank';"usarOnClientClick="document.getElementById('Form').target ='_blank';"
— colincameron

Sim, funcionou para mim, mas está abrindo a página em uma nova guia, não em uma nova janela. Como posso abrir minha página em uma nova janela?
— Shilpa Soni

61

Você pode usar isso como método de extensão

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

Com isso, você obtém uma boa substituição no objeto Response real

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");

1
o que tenho que enviar para o primeiro arrgumento?
— Raghuveera,

Cara, essa solução fantástica que realmente funciona! Obrigado.
— Klaus Nji

Excelente solução reutilizável! A única desvantagem é o fato de que a nova janela está bloqueada pelo bloqueador de pop-ups.
— MeanGreen

O primeiro argumento é seu objeto Response atual.
— Futureproof 02 de

Obrigado pelo feedback!
— Sasa Tancev

26

Como Response.Redirect é iniciado no servidor, você não pode fazer isso usando isso.

Se você puder gravar diretamente no fluxo de resposta, poderá tentar algo como:

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");

3
Isso funciona, mas a página onde meu botão está começa as alterações, é como se o CSS ou DIVS estivessem sendo afetados.
— Etienne,

a nova janela aparece sempre que vai e volta.
— devXen

26

Controle o seu url por meio do manipulador de eventos de clique:

string strUrl = "/some/url/path" + myvar;

Então:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);

O bloqueador de pop-ups bloqueia o url de qualquer outra área ao redor disso ??
— Rafay

3
window.open neste exemplo será sempre tratado como um 'pop-up', pois é iniciado por código e não por uma ação do usuário. se window.open for chamado quando o usuário clicar em um elemento, isso deve evitar a ação pop-up bloqueada pelo navegador.
— steve

@steve, Esta é uma solução excelente e muito simples. Usei sua abordagem para Response.Redirect para um pop-up.
— Sunil

14

O truque do fixform é legal, mas:

  1. Você pode não ter acesso ao código que carrega na nova janela.

  2. Mesmo que o faça, você está dependendo do fato de que ele sempre carrega, sem erros.

  3. E você depende do fato de que o usuário não clicará em outro botão antes que a outra página tenha a chance de carregar e executar o fixform.

Eu sugeriria fazer isso em vez disso:

OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);"

E configure o fixform na mesma página , assim:

function fixform() {
   document.getElementById("aspnetForm").target = '';
}

11

Você também pode usar no code-behind desta forma

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);

2
Isso funciona bem para mim e é basicamente a versão resumida da solução de Abhishek Shrivastava acima. No entanto, há algumas advertências a serem observadas. Primeiro, isso acionará bloqueadores de pop-up. Em particular, ele não funcionará no Safari 5.0 se o bloqueador de pop-ups estiver habilitado, já que o Safari não solicita pop-ups bloqueados e não permite que você faça exceções de pop-up. Em segundo lugar, o Chrome ignora o argumento da página para window.open. Portanto, mesmo se você usá- window.open('page.aspx','_blank');lo, ainda o abre em uma nova janela com a barra de navegação desabilitada e os botões de navegação ausentes em vez de uma nova guia.
— Kasey Speakman

8

Isso não é possível com Response.Redirect, pois acontece no lado do servidor e não pode direcionar seu navegador para realizar essa ação. O que restaria na janela inicial? Uma página em branco?


8

o método pop-up fornecerá uma pergunta segura ao visitante.

aqui está minha solução simples: e trabalhando em todos os lugares.

<script type="text/javascript">
    function targetMeBlank() {
        document.forms[0].target = "_blank";
    }
</script>

<asp:linkbutton  runat="server" ID="lnkbtn1" Text="target me to blank dude" OnClick="lnkbtn1_Click" OnClientClick="targetMeBlank();"/>

Não posso editar sua postagem porque não tem pelo menos 6 caracteres, mas não é '("href")', é '["href"]'
— Nickso


4

Se você puder reestruturar seu código para que não precise postback, poderá usar este código no evento PreRender do botão:

protected void MyButton_OnPreRender(object sender, EventArgs e)
{
    string URL = "~/MyPage.aspx";
    URL = Page.ResolveClientUrl(URL);
    MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}

4

Você também pode usar o código a seguir para abrir uma nova página em uma nova guia.

<asp:Button ID="Button1" runat="server" Text="Go" 
  OnClientClick="window.open('yourPage.aspx');return false;" 
  onclick="Button3_Click" />

E apenas chame Response.Redirect ("yourPage.aspx"); por trás do evento de botão.


Este método dispara tanto OnClientClick quanto onclick . Significou que alguma página foi aberta na nova janela, bem como alguma ação foi realizada na mesma página
— Manivannan Nagarajan

3

Eu sempre uso este código ... Use este código

String clientScriptName = "ButtonClickScript";
Type clientScriptType = this.GetType ();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager clientScript = Page.ClientScript;

// Check to see if the client script is already registered.
if (!clientScript.IsClientScriptBlockRegistered (clientScriptType, clientScriptName))
    {
     StringBuilder sb = new StringBuilder ();
     sb.Append ("<script type='text/javascript'>");
     sb.Append ("window.open(' " + url + "')"); //URL = where you want to redirect.
     sb.Append ("</script>");
     clientScript.RegisterClientScriptBlock (clientScriptType, clientScriptName, sb.ToString ());
     }

Este código nunca afetará a classe CSS, então a janela pai não será afetada de forma alguma !!
— Abhishek Shrivastava de

1
Bem, este certamente é um forte argumento para MVC. Para não tirar nada do seu código. Longe disso. São coisas assim que tipificam as formas da web, blech.
— MrBoJangles

Todo esse código pode ser condensado em uma linha ... veja a solução de shalu abaixo. É exatamente o mesmo efeito, mas sem todo o inchaço desnecessário.
— Kasey Speakman

1

Aqui está uma versão do jQuery baseada na resposta de @takrl e @tom acima. Nota: nenhum formid codificado (denominado aspnetForm acima) e também não usa referências diretas a form.target que o Firefox pode achar problemáticas:

<asp:Button ID="btnSubmit" OnClientClick="openNewWin();"  Text="Submit" OnClick="btn_OnClick" runat="server"/>

Então, em seu arquivo js referenciado na MESMA página:

function openNewWin () {
    $('form').attr('target','_blank');
    setTimeout('resetFormTarget()', 500);
}

function resetFormTarget(){
    $('form').attr('target','');
}

1

Eu usei Hyperlink em vez de LinkButton e funcionou muito bem, ele tem a propriedade Target, então resolveu meu problema. Havia a solução com Response.Write, mas isso estava bagunçando meu layout, e aquele com ScriptManager, a cada atualização ou volta estava reabrindo a janela. Então foi assim que resolvi:

<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target="_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink>

0

Você pode usar o Page.RegisterStartupScript para garantir que o javascript seja acionado no carregamento da página.


0

você pode abrir uma nova janela de código asp.net atrás usando ajax como fiz aqui http://alexandershapovalov.com/open-new-window-from-code-behind-in-aspnet-68/

protected void Page_Load(object sender, EventArgs e)
{
    Calendar1.SelectionChanged += CalendarSelectionChanged;
}

private void CalendarSelectionChanged(object sender, EventArgs e)
{
    DateTime selectedDate = ((Calendar) sender).SelectedDate;
    string url = "HistoryRates.aspx?date="
+ HttpUtility.UrlEncode(selectedDate.ToShortDateString());
    ScriptManager.RegisterClientScriptBlock(this, GetType(),
"rates" + selectedDate, "openWindow('" + url + "');", true);
}

0

Nenhum dos exemplos anteriores funcionou para mim, então decidi postar minha solução. Nos eventos de clique de botão, aqui está o código por trás.

Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"

Eu estava tendo que modificar o código response.redirect de outra pessoa para abrir em um novo navegador.


0

Eu usei essa abordagem, ela não exige que você faça nada no pop-up (ao qual eu não tive acesso porque estava redirecionando para um arquivo PDF). Ele também usa classes.

$(function () {
    //--- setup click event for elements that use a response.redirect in code behind but should open in a new window
    $(".new-window").on("click", function () {

        //--- change the form's target
        $("#aspnetForm").prop("target", "_blank");

        //--- change the target back after the window has opened
        setTimeout(function () {
            $("#aspnetForm").prop("target", "");
        }, 1);
    });
});

Para usar, adicione a classe "nova janela" a qualquer elemento. Você não precisa adicionar nada à tag do corpo. Esta função configura a nova janela e a corrige na mesma função.


0

Eu fiz isso colocando target = "_ blank" no linkbutton

<asp:LinkButton ID="btn" runat="server" CausesValidation="false"  Text="Print" Visible="false" target="_blank"  />

em seguida, no pageload codebehind apenas defina o atributo href:

btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId={0}", formId)

0

HTML

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" OnClientClick = "SetTarget();" />

Javascript:

function SetTarget() {
 document.forms[0].target = "_blank";}

E codebehind:

Response.Redirect(URL); 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.