Response.Redirect ke jendela baru


118

Saya ingin melakukan Response.Redirect("MyPage.aspx")tetapi membukanya di jendela browser baru. Saya telah melakukan ini sebelumnya tanpa menggunakan metode skrip register JavaScript. Saya hanya tidak ingat bagaimana?

Jawaban:


114

Saya baru saja menemukan jawabannya dan berhasil :)

Anda perlu menambahkan yang berikut ini ke tautan / tombol sisi server Anda:

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

Seluruh kode tombol saya terlihat seperti ini:

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

Di sisi server OnClick saya lakukan Response.Redirect("MyPage.aspx");dan halaman dibuka di jendela baru.

Bagian lain yang perlu Anda tambahkan adalah memperbaiki target formulir jika tidak, setiap tautan akan terbuka di jendela baru. Untuk melakukannya, tambahkan baris berikut di header jendela POPUP Anda.

<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>

dan

<body onload="fixform()">

2
Tidak karena ini menggunakan javascript untuk mengubah target formulir. Sebaliknya, halaman akan dikirim seperti biasa.
Toby Mills

Selain itu, Anda dapat mengalami pelanggaran keamanan jika ingin mengalihkan ke halaman di luar direktori virtual Anda.
Drejc

1
Entah bagaimana dalam kasus saya itu tidak berfungsi. Saya membuka halaman yang sama di jendela baru dan menulis tanggapan untuk halaman itu. Tetapi ketika saya menyimpan metode fixform () di halaman master, itu memunculkan kesalahan yang mengatakan dokumen adalah null. Tidak yakin mengapa membuang masih berusaha mencari solusi. Meskipun saya telah menemukan solusi sementara dengan menggunakan onClientClick = "aspnetForm.target = '';" properti untuk tombol lain di halaman itu.
JPReddy

1
Saya baru saja mencoba ini dan alih-alih OnClientClick="aspnetForm.target ='_blank';"saya harus menggunakanOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron

Ya, itu berhasil untuk saya tetapi membuka halaman ke tab baru, bukan di jendela baru. Bagaimana cara membuka halaman saya di jendela baru?
Shilpa Soni

61

Anda dapat menggunakan ini sebagai metode ekstensi

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

Dengan ini Anda mendapatkan penggantian yang bagus pada objek Respon yang sebenarnya

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

1
apa yang harus saya kirim untuk arrgument pertama?
Raghuveera

Sobat, ini adalah solusi luar biasa yang benar-benar berfungsi! Terima kasih.
Klaus Nji

Solusi yang dapat digunakan kembali yang sangat baik! Satu-satunya downside adalah kenyataan bahwa jendela baru diblokir oleh pemblokir popup.
MeanGreen

Argumen pertama adalah objek Respon Anda saat ini.
Futureproof

Terima kasih atas tanggapannya!
Sasa Tancev

26

Karena Response.Redirect dimulai di server, Anda tidak dapat melakukannya menggunakan itu.

Jika Anda dapat menulis langsung ke aliran Respons, Anda dapat mencoba sesuatu seperti:

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

3
Ini berfungsi, tetapi kemudian halaman di mana tombol saya adalah perubahan, seperti CSS atau DIVS yang terpengaruh.
Etienne

jendela baru muncul setiap saat saat bolak-balik.
devXen

26

Susun url Anda melalui click event handler:

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

Kemudian:

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

Pemblokir popup memblokir url wa lain di sekitar ini ??
Rafay

3
window.open dalam contoh ini akan selalu diperlakukan sebagai 'popup' karena dimulai oleh kode dan bukan tindakan pengguna. jika window.open dipanggil saat pengguna mengklik sebuah elemen, itu harus menghindari tindakan popup yang diblokir oleh browser.
steve

@ steve, Ini solusi yang sangat baik dan sangat sederhana. Saya menggunakan pendekatan Anda untuk Response.Redirect ke popup.
Sunil

14

Trik fixform memang rapi, tetapi:

  1. Anda mungkin tidak memiliki akses ke kode apa yang dimuat di jendela baru.

  2. Bahkan jika Anda melakukannya, Anda bergantung pada fakta bahwa itu selalu memuat, bebas dari kesalahan.

  3. Dan Anda bergantung pada fakta bahwa pengguna tidak akan mengklik tombol lain sebelum halaman lain mendapat kesempatan untuk memuat dan menjalankan fixform.

Saya akan menyarankan melakukan ini sebagai gantinya:

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

Dan atur fixform pada halaman yang sama , terlihat seperti ini:

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

11

Anda juga dapat menggunakan kode di belakang seperti ini

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

2
Ini berfungsi dengan baik untuk saya dan pada dasarnya adalah versi singkat dari solusi Abhishek Shrivastava di atas. Namun, ada beberapa peringatan yang harus diperhatikan. Pertama, ini akan memicu pemblokir popup. Secara khusus, ini tidak akan berfungsi sama sekali di Safari 5.0 jika pemblokir popup diaktifkan karena Safari tidak meminta Anda untuk memblokir popup dan tidak memungkinkan Anda membuat pengecualian popup. Kedua, Chrome mengabaikan argumen halaman ke window.open. Jadi, meskipun Anda menggunakannya window.open('page.aspx','_blank');, tetap terbuka di jendela baru dengan bilah navigasi dinonaktifkan dan tombol navigasi tidak ada, bukan tab baru.
Kasey Speakman

8

Ini tidak mungkin dilakukan dengan Response.Redirect seperti yang terjadi di sisi server dan tidak dapat mengarahkan browser Anda untuk melakukan tindakan itu. Apa yang tersisa di jendela awal? Halaman kosong?


8

metode popup akan memberikan pertanyaan aman kepada pengunjung ..

inilah solusi sederhana saya: dan bekerja di mana-mana.

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

Saya tidak dapat mengedit kiriman Anda karena bukan setidaknya 6 karakter, tetapi ini bukan '("href")', Ini adalah '["href"]'
Nickso


4

Jika Anda dapat menyusun ulang kode Anda sehingga Anda tidak perlu melakukan postback, maka Anda dapat menggunakan kode ini di acara PreRender tombol:

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

4

Anda juga dapat menggunakan kode berikut untuk membuka halaman baru di tab baru.

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

Dan panggil saja Response.Redirect ("yourPage.aspx"); di belakang acara tombol.


Metode ini memicu OnClientClick serta onclick . Artinya beberapa halaman dibuka di jendela baru serta beberapa tindakan telah dilakukan di halaman yang sama
Manivannan Nagarajan

3

Saya selalu menggunakan kode ini ... Gunakan kode ini

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

Kode ini tidak akan pernah mempengaruhi kelas CSS sehingga jendela induk tidak akan terpengaruh sama sekali !!
Abhishek Shrivastava

1
Nah, ini pasti argumen yang kuat untuk MVC. Tidak mengambil apa pun dari kode Anda. Jauh dari itu. Hal-hal seperti inilah yang menandai formulir web, blech.
MrBoJangles

Semua kode ini dapat diringkas menjadi satu baris ... lihat solusi shalu di bawah ini. Ini efek yang persis sama, tetapi tanpa semua pembengkakan yang tidak diperlukan.
Kasey Speakman

1

Berikut versi jQuery berdasarkan jawaban oleh @takrl dan @tom di atas. Catatan: tidak ada formid yang di-hardcode (dinamai aspnetForm di atas) dan juga tidak menggunakan referensi form.target langsung yang mungkin dianggap bermasalah oleh Firefox:

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

Kemudian di file js anda direferensikan di halaman SAMA:

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

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

1

Saya menggunakan Hyperlink daripada LinkButton dan berfungsi dengan baik, ia memiliki properti Target sehingga memecahkan masalah saya. Ada solusi dengan Response.Write tetapi itu mengacaukan tata letak saya, dan yang dengan ScriptManager, di setiap penyegaran atau kembali membuka kembali jendela. Jadi begini cara saya menyelesaikannya:

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

0

Anda mungkin ingin menggunakan Page.RegisterStartupScript untuk memastikan bahwa javascript diaktifkan saat halaman dimuat.


0

Anda dapat membuka jendela baru dari kode asp.net di belakang menggunakan ajax seperti yang saya lakukan di sini 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

Tidak ada contoh sebelumnya yang berhasil untuk saya, jadi saya memutuskan untuk memposting solusi saya. Dalam acara klik tombol, berikut adalah kode di belakangnya.

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

Saya harus mengubah kode response.redirect orang lain untuk membuka di browser baru.


0

Saya menggunakan pendekatan ini, tidak mengharuskan Anda melakukan apa pun pada popup (yang tidak saya akses karena saya mengarahkan ke file PDF). Ini juga menggunakan kelas.

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

Untuk menggunakan, tambahkan kelas "jendela baru" ke elemen apa pun. Anda tidak perlu menambahkan apapun ke tag badan. Fungsi ini menyiapkan jendela baru dan memperbaikinya di fungsi yang sama.


0

Saya melakukan ini dengan meletakkan target = "_ blank" di tombol tautan

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

lalu di pageload codebehind setel atribut 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";}

DAN codebehind:

Response.Redirect(URL); 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.