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.