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?

hims056
fonte

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()">
miguel
fonte
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");
Sasa Tancev
fonte
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>");
JamesSugrue
fonte
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);
Steve
fonte
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 = '';
}
tom
fonte
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);
sth
fonte
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?

John Sheehan
fonte
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();"/>
Kursat Turkay
fonte
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;";
}
humbads
fonte
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.

Zohaib
fonte
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 ());
     }
Abhishek Shrivastava
fonte
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','');
}
Ben Barreth
fonte
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>
bokkie
fonte
0

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

CodeRot
fonte
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);
}
Yaplex
fonte
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.

crh225
fonte
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.

Ricketts
fonte
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)
Hevski
fonte
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); 
Tran Anh Hien
fonte