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.