Yanıt.Yeni pencereye yönlendir


118

Bir yapmak istiyorum Response.Redirect("MyPage.aspx")ama yeni bir tarayıcı penceresinde açmasını istiyorum . Bunu daha önce JavaScript kayıt komut dosyası yöntemini kullanmadan yaptım. Nasıl olduğunu hatırlayamıyorum

Yanıtlar:


114

Cevabı yeni buldum ve işe yarıyor :)

Aşağıdakileri sunucu tarafı bağlantınıza / düğmenize eklemeniz gerekir:

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

Tüm düğme kodum şuna benzer:

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

Sunucu tarafında OnClick a yapıyorum Response.Redirect("MyPage.aspx");ve sayfa yeni bir pencerede açılıyor.

Eklemeniz gereken diğer kısım, formun hedefini düzeltmektir, aksi takdirde her bağlantı yeni bir pencerede açılır. Bunu yapmak için aşağıdakileri POPUP pencerenizin başlığına ekleyin.

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

ve

<body onload="fixform()">

2
Hayır, çünkü bu, formun hedefini değiştirmek için javascript kullanır. Bunun yerine, sayfa normal şekilde gönderilir.
Toby Mills

Ayrıca, sanal dizininizin dışındaki bir sayfaya yeniden yönlendirmek istiyorsanız, bir güvenlik ihlaliniz olabilir.
Drejc

1
Bir şekilde benim durumumda çalışmıyor. Yeni pencerede aynı sayfayı açıyorum ve o sayfaya cevabı yazıyorum. Ancak ana sayfada fixform () yöntemini tuttuğumda, belgenin boş olduğunu söyleyen bir hata veriyor. Hala bir çözüm bulmaya çalışırken neden attığından emin değilim. OnClientClick = "aspnetForm.target = '';" kullanarak geçici bir çözüm bulmuş olsam da o sayfadaki diğer düğmeler için özellik.
JPReddy

1
Bunu daha yeni denedim ve bunun yerine OnClientClick="aspnetForm.target ='_blank';"kullanmak zorunda kaldımOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron

Evet, benim için çalıştı ama sayfayı yeni bir pencerede değil, yeni sekmeye açılıyor. Sayfamı yeni bir pencerede nasıl açabilirim?
Shilpa Soni

62

Bunu bir uzatma yöntemi olarak kullanabilirsiniz

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

Bununla, gerçek Response nesnesinde hoş bir geçersiz kılma elde edersiniz

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

1
ilk düzenleme için ne göndermem gerekiyor?
Raghuveera

Dostum, bu gerçekten işe yarayan harika bir çözüm! Teşekkür ederim.
Klaus Nji

Mükemmel yeniden kullanılabilir çözüm! Tek dezavantajı, yeni pencerenin pop-up engelleyici tarafından engellenmesidir.
MeanGreen

İlk argüman mevcut Response nesnenizdir.
Futureproof

Geri bildirim için teşekkürler!
Sasa Tancev

26

Response.Redirect sunucuda başlatıldığı için bunu kullanarak yapamazsınız.

Doğrudan Yanıt akışına yazabiliyorsanız, aşağıdaki gibi bir şey deneyebilirsiniz:

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

3
Bu işe yarıyor, ancak daha sonra düğmemin değiştiği sayfa, CSS veya DIVS gibi etkileniyor.
Etienne

yeni pencere her defasında ileri geri giderken açılır.
devXen

26

URL'nizi tıklama etkinliği işleyicisiyle oluşturun:

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

Sonra:

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

Pop-up engelleyici, bunun etrafında başka bir wa url'yi engeller mi?
Rafay

3
Bu örnekte window.open, bir kullanıcı eylemi değil kod tarafından başlatıldığından her zaman bir 'popup' olarak ele alınacaktır. kullanıcı bir öğeyi tıkladığında window.open çağrılırsa, bu, tarayıcı tarafından engellenen pop-up eyleminden kaçınmalıdır.
steve

@steve, Bu mükemmel ve çok basit bir çözüm. Response.Redirect to a popup. Yaklaşımınızı kullandım.
Sunil

14

Fixform hilesi düzgün, ancak:

  1. Yeni pencerede yüklenenlerin koduna erişiminiz olmayabilir.

  2. Yapsanız bile, her zaman hatasız olarak yükleneceği gerçeğine bağlısınız.

  3. Ve diğer sayfanın fixform'u yükleme ve çalıştırma şansı elde etmeden önce kullanıcının başka bir düğmeyi tıklamayacağı gerçeğine bağlısınız.

Bunun yerine şunu yapmanızı öneririm:

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

Ve aynı sayfada aşağıdaki gibi görünen bir düzeltme formu kurun :

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

11

Bu şekilde arkasındaki kodda da kullanabilirsiniz

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

2
Bu benim için iyi çalışıyor ve temelde Abhishek Shrivastava'nın yukarıdaki çözümünün kısa versiyonu. Ancak, dikkat edilmesi gereken birkaç uyarı var. İlk olarak, bu açılır pencere engelleyicilerini tetikleyecektir. Özellikle, açılır pencere engelleyici etkinleştirilirse, Safari engellenen açılır pencereleri istemediğinden ve açılır pencere istisnaları yapmanıza izin vermediğinden, Safari 5.0'da hiç çalışmayacaktır. İkinci olarak, Chrome, window.open için sayfa bağımsız değişkenini yok sayar. Bu nedenle, onu kullansanız bile window.open('page.aspx','_blank');, gezinme çubuğu devre dışı bırakılmış ve yeni bir sekme yerine gezinme düğmeleri eksik olan yeni bir pencerede açılır.
Kasey Speakman

8

Bu, Response.Redirect ile sunucu tarafında gerçekleştiği için mümkün değildir ve tarayıcınızı bu işlemi yapması için yönlendiremez. İlk pencerede ne kalır? Boş bir sayfa mı?


8

pop-up yöntemi ziyaretçiye güvenli bir soru verecektir ..

işte benim basit çözümüm: ve her yerde çalışmak.

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

Gönderinizi en az 6 karakter olmadığı için düzenleyemiyorum, ancak '("href")' değil, "[" href "] '
Nickso


4

Kodunuzu geri göndermenize gerek kalmayacak şekilde yeniden yapılandırabilirseniz, bu kodu düğmenin PreRender etkinliğinde kullanabilirsiniz:

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

4

Yeni sekmede yeni sayfa açmak için aşağıdaki kodu da kullanabilirsiniz.

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

Ve Response.Redirect ("yourPage.aspx") çağırın; düğme olayının arkasında.


Bu yöntem, hem tetikler OnClientClick gibi Onclick . Yeni pencerede bir sayfa açıldığı ve aynı sayfada bazı işlemler yapıldığı anlamına geliyor
Manivannan Nagarajan

3

Ben her zaman bu kodu kullanıyorum ... Bu kodu kullan

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

Bu kod CSS sınıfını asla etkilemeyeceğinden, ana pencere hiç etkilenmeyecektir!
Abhishek Shrivastava

1
Bu kesinlikle MVC için güçlü bir argüman. Kodunuzdan hiçbir şey almamalısınız. Ne münasebet. Web formlarını simgeleyen bu tür şeyler, blech.
MrBoJangles

Bu kodun tümü bir satıra kısaltılabilir ... aşağıdaki shalu'nun çözümüne bakın. Bu tamamen aynı etki, ancak gereksiz şişkinlik olmadan.
Kasey Speakman

1

İşte yukarıdaki @takrl ve @tom yanıtına dayalı bir jQuery sürümü. Not: sabit kodlanmış formid (yukarıda aspnetForm olarak adlandırılmıştır) yoktur ve ayrıca Firefox'un sorunlu bulabileceği doğrudan form.target referanslarını da kullanmaz:

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

Ardından, AYNI sayfasında referans verilen js dosyanızda:

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

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

1

LinkButton yerine Hyperlink kullandım ve gayet iyi çalıştı, Target özelliğine sahip, bu yüzden sorunumu çözdü. Response.Write ile bir çözüm vardı ama bu benim düzenimi bozuyordu ve ScriptManager ile olan her yenilemede veya geri pencereyi yeniden açıyordu. İşte bu şekilde çözdüm:

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

0

Javascript'in sayfa yüklendiğinde çalıştığından emin olmak için Page.RegisterStartupScript'i kullanmak isteyebilirsiniz.


0

Eğer yapabilirsiniz arkasında asp.net kodundan yeni bir pencere açmak Burada yaptığım gibi ajax kullanarak 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

Önceki örneklerin hiçbiri benim için işe yaramadı, bu yüzden çözümümü göndermeye karar verdim. Düğme tıklama olaylarında, arkasındaki kod burada verilmiştir.

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

Yeni bir tarayıcıda açmak için başka birinin yanıtını değiştirmek zorunda kalıyordum. Yeniden yönlendirme kodu.


0

Bu yaklaşımı kullandım, pop-up'ta herhangi bir şey yapmanızı gerektirmiyor (bir PDF dosyasına yönlendiriyordum çünkü buna erişimim yoktu). Ayrıca sınıfları kullanır.

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

Kullanmak için herhangi bir elemana "new-window" sınıfını ekleyin. Gövde etiketine herhangi bir şey eklemenize gerek yoktur. Bu işlev, yeni pencereyi kurar ve aynı işlevde düzeltir.


0

Bunu, bağlantı düğmesine target = "_ blank" koyarak yaptım

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

daha sonra codebehind pageload'da href özelliğini ayarlayın:

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

VE kod arkasında:

Response.Redirect(URL); 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.