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?

hims056
sumber

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

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

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

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

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

crh225.dll
sumber
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.

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