Odpowiedź Przekieruj do nowego okna


118

Chcę to zrobić, Response.Redirect("MyPage.aspx")ale mam je otworzyć w nowym oknie przeglądarki. Robiłem to wcześniej bez użycia metody skryptu rejestru JavaScript. Po prostu nie pamiętam jak?

Odpowiedzi:


114

Właśnie znalazłem odpowiedź i działa :)

Musisz dodać następujące elementy do łącza / przycisku po stronie serwera:

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

Mój cały kod przycisku wygląda mniej więcej tak:

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

Po stronie serwera OnClick robię Response.Redirect("MyPage.aspx");a strona jest otwierana w nowym oknie.

Inną częścią, którą musisz dodać, jest naprawienie celu formularza, w przeciwnym razie każde łącze otworzy się w nowym oknie. Aby to zrobić, dodaj następujące informacje w nagłówku okna 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>

i

<body onload="fixform()">

2
Nie, ponieważ używa javascript do zmiany celu formularza. Zamiast tego strona zostanie przesłana normalnie.
— Toby Mills,

Ponadto możesz mieć naruszenie bezpieczeństwa, jeśli chcesz przekierować na stronę poza katalogiem wirtualnym.
— Drejc

1
Jakoś w moim przypadku to nie działa. Otwieram tę samą stronę w nowym oknie i piszę odpowiedź na tę stronę. Ale kiedy zachowuję metodę fixform () w masterpage, generuje błąd informujący, że dokument jest pusty. Nie jestem pewien, dlaczego rzuca nadal próbując znaleźć rozwiązanie. Chociaż wymyśliłem tymczasowe rozwiązanie, używając onClientClick = "aspnetForm.target = '';" właściwość dla innych przycisków na tej stronie.
— JPReddy

1
Właśnie tego spróbowałem i zamiast tego OnClientClick="aspnetForm.target ='_blank';"musiałem użyćOnClientClick="document.getElementById('Form').target ='_blank';"
— colincameron

Tak, to zadziałało, ale otwiera stronę w nowej karcie, a nie w nowym oknie. Jak mogę otworzyć moją stronę w nowym oknie?
— Shilpa Soni

61

Możesz użyć tego jako metody rozszerzenia

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

Dzięki temu otrzymujesz ładne zastąpienie rzeczywistego obiektu Response

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

1
co mam wysłać za pierwszy instrument?
— Raghuveera

Stary, to fantastyczne rozwiązanie, które faktycznie działa! Dziękuję Ci.
— Klaus Nji

Doskonałe rozwiązanie wielokrotnego użytku! Jedynym minusem jest fakt, że nowe okno jest blokowane przez moduł blokujący wyskakujące okienka.
— MeanGreen,

Pierwszy argument to Twój aktualny obiekt Response.
— Futureproof

Dzięki za opinię!
— Sasa Tancev

26

Ponieważ Response.Redirect jest inicjowane na serwerze, nie możesz tego zrobić za pomocą tego.

Jeśli możesz pisać bezpośrednio do strumienia odpowiedzi, możesz spróbować czegoś takiego:

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

3
To działa, ale potem zmienia się strona, na której znajduje się mój przycisk, podobnie jak CSS lub DIVS.
— Etienne

nowe okno wyskakuje za każdym razem, gdy przechodzisz tam iz powrotem.
— devXen,

26

Skonfiguruj swój adres URL za pomocą modułu obsługi zdarzeń kliknięcia:

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

Następnie:

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

Blokowanie wyskakujących okienek blokuje adres URL, jakikolwiek inny obszar wokół tego?
— Rafay

3
Okno.open w tym przykładzie zawsze będzie traktowane jako „pop-up”, ponieważ jest inicjowane kodem, a nie działaniem użytkownika. jeśli window.open jest wywoływane, gdy użytkownik kliknie element, powinno to ominąć zablokowaną akcję wyskakującą przeglądarki.
— steve

@steve, To doskonałe i bardzo proste rozwiązanie. Skorzystałem z Twojego podejścia do Response.Redirect do wyskakującego okienka.
— Sunil

14

Sztuczka fixform jest zgrabna, ale:

  1. Możesz nie mieć dostępu do kodu tego, co ładuje się w nowym oknie.

  2. Nawet jeśli to zrobisz, zależy ci na tym, że zawsze ładuje się, bezbłędnie.

  3. I jesteś zależny od tego, że użytkownik nie kliknie żadnego przycisku, zanim inna strona nie będzie miała szansy załadowania i uruchomienia fixform.

Sugerowałbym zrobienie tego zamiast tego:

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

I skonfiguruj fixform na tej samej stronie , wyglądającej tak:

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

11

Możesz również użyć w kodzie w ten sposób

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

2
To działa dobrze dla mnie i jest w zasadzie krótką wersją powyższego rozwiązania Abhisheka Shrivastavy. Jest jednak kilka zastrzeżeń, o których należy pamiętać. Po pierwsze, spowoduje to uruchomienie blokowania wyskakujących okienek. W szczególności nie będzie działać w przeglądarce Safari 5.0, jeśli blokada wyskakujących okienek jest włączona, ponieważ Safari nie monituje o zablokowane wyskakujące okienka i nie pozwala na tworzenie wyjątków. Po drugie, Chrome ignoruje argument strony w oknie.open. Więc nawet jeśli window.open('page.aspx','_blank');go używasz , nadal otwiera go w nowym oknie z wyłączonym paskiem nawigacyjnym i brakującymi przyciskami nawigacji zamiast nowej karty.
— Kasey Speakman

8

Nie jest to możliwe w przypadku Response.Redirect, ponieważ ma to miejsce po stronie serwera i nie może nakazać przeglądarce podjęcia tej akcji. Co zostało w początkowym oknie? Pusta strona?


8

wyskakująca metoda zapewni odwiedzającym bezpieczne pytanie.

oto moje proste rozwiązanie: i działające wszędzie.

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

Nie mogę edytować twojego posta, ponieważ nie ma co najmniej 6 znaków, ale nie jest to '("href")', to jest '["href"]'
— Nickso


4

Jeśli możesz zmienić strukturę kodu tak, aby nie było potrzeby ogłaszania zwrotnego, możesz użyć tego kodu w zdarzeniu PreRender przycisku:

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

4

Możesz również użyć poniższego kodu, aby otworzyć nową stronę w nowej karcie.

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

I po prostu wywołaj Response.Redirect ("yourPage.aspx"); zdarzenie za przycisk.


Ta metoda wyzwala zarówno OnClientClick, jak i onclick . Oznacza to, że jakaś strona jest otwierana w nowym oknie, a jakaś akcja została wykonana na tej samej stronie
— Manivannan Nagarajan,

3

Zawsze używam tego kodu ... Użyj tego kodu

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

Ten kod nigdy nie wpłynie na klasę CSS, więc okno nadrzędne nie będzie miało żadnego wpływu !!
— Abhishek Shrivastava

1
Cóż, z pewnością jest to mocny argument dla MVC. Nie zabieraj niczego z twojego kodu. Daleko stąd. Takie rzeczy są typowe dla formularzy internetowych, blech.
— MrBoJangles

Cały ten kod można skondensować do jednej linii ... zobacz rozwiązanie shalu poniżej. To dokładnie ten sam efekt, ale bez tego całego niepotrzebnego wzdęcia.
— Kasey Speakman

1

Oto wersja jQuery oparta na odpowiedzi @takrl i @tom powyżej. Uwaga: nie ma zakodowanego na stałe formid (o nazwie aspnetForm powyżej), a także nie używa bezpośrednich odniesień do form.target, które Firefox może uznać za problematyczne:

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

Następnie w pliku js, do którego odwołuje się ta SAMA strona:

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

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

1

Użyłem Hyperlink zamiast LinkButton i działało dobrze, ma właściwość Target, więc rozwiązało mój problem. Było rozwiązanie z Response.Write, ale to zepsuło mój układ, a ten z ScriptManager, przy każdym odświeżaniu lub z powrotem otwierał ponownie okno. Więc tak to rozwiązałem:

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

0

Możesz użyć Page.RegisterStartupScript, aby upewnić się, że skrypt javascript uruchamia się podczas ładowania strony.


0

możesz otworzyć nowe okno z kodu asp.net za pomocą ajax, tak jak ja tutaj 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

Żaden z poprzednich przykładów nie działał dla mnie, więc zdecydowałem się opublikować swoje rozwiązanie. W zdarzeniach związanych z kliknięciem przycisku, oto kod.

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

Musiałem zmodyfikować kod response.redirect innej osoby, aby otworzyć go w nowej przeglądarce.


0

Użyłem tego podejścia, nie wymaga to nic robić w wyskakującym okienku (do którego nie miałem dostępu, ponieważ przekierowałem do pliku PDF). Używa również klas.

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

Aby użyć, dodaj klasę „nowe-okno” do dowolnego elementu. Nie musisz niczego dodawać do tagu body. Ta funkcja konfiguruje nowe okno i naprawia je w tej samej funkcji.


0

Zrobiłem to, wstawiając target = "_ blank" w linkbutton

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

następnie w codebehind pageload ustaw atrybut 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";}

AND codebehind:

Response.Redirect(URL); 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.