การตอบสนองเปลี่ยนเส้นทางไปที่หน้าต่างใหม่


118

ฉันต้องการทำResponse.Redirect("MyPage.aspx")แต่เปิดในหน้าต่างเบราว์เซอร์ใหม่ ฉันเคยทำสิ่งนี้มาก่อนโดยไม่ใช้วิธีการลงทะเบียนสคริปต์ JavaScript ฉันจำไม่ได้ว่าอย่างไร?

คำตอบ:


114

ฉันเพิ่งพบคำตอบและใช้งานได้ :)

คุณต้องเพิ่มสิ่งต่อไปนี้ในลิงค์ / ปุ่มฝั่งเซิร์ฟเวอร์ของคุณ:

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

รหัสปุ่มทั้งหมดของฉันมีลักษณะดังนี้:

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

ในฝั่งเซิร์ฟเวอร์ OnClick ฉันทำResponse.Redirect("MyPage.aspx");และเพจถูกเปิดในหน้าต่างใหม่

ส่วนอื่น ๆ ที่คุณต้องเพิ่มคือการแก้ไขเป้าหมายของแบบฟอร์มมิฉะนั้นทุกลิงก์จะเปิดขึ้นในหน้าต่างใหม่ โดยเพิ่มสิ่งต่อไปนี้ในส่วนหัวของหน้าต่าง 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>

และ

<body onload="fixform()">

2
ไม่ได้เนื่องจากใช้จาวาสคริปต์เพื่อเปลี่ยนเป้าหมายของแบบฟอร์ม แทนที่จะส่งเพจตามปกติ
Toby Mills

นอกจากนี้คุณอาจมีการละเมิดความปลอดภัยหากคุณต้องการเปลี่ยนเส้นทางไปยังเพจนอกไดเรกทอรีเสมือนของคุณ
Drejc

1
อย่างใดในกรณีของฉันมันไม่ทำงาน ฉันเปิดหน้าเดียวกันในหน้าต่างใหม่และเขียนคำตอบไปยังหน้านั้น แต่เมื่อฉันเก็บเมธอด fixform () ไว้ในมาสเตอร์เพจมันแสดงข้อผิดพลาดว่าเอกสารเป็นโมฆะ ไม่แน่ใจว่าทำไมถึงขว้างยังพยายามหาทางแก้ไข แม้ว่าฉันจะหาวิธีแก้ปัญหาชั่วคราวโดยใช้ onClientClick = "aspnetForm.target = '';" คุณสมบัติสำหรับปุ่มอื่น ๆ ในเพจนั้น
JPReddy

1
ฉันเพิ่งลองสิ่งนี้และแทนที่จะOnClientClick="aspnetForm.target ='_blank';"ต้องใช้OnClientClick="document.getElementById('Form').target ='_blank';"
colincameron

ใช่มันใช้งานได้สำหรับฉัน แต่มันกำลังเปิดหน้าในแท็บใหม่ไม่ใช่ในหน้าต่างใหม่ ฉันจะเปิดเพจของฉันในหน้าต่างใหม่ได้อย่างไร?
Shilpa Soni

62

คุณสามารถใช้เป็นวิธีการขยาย

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

ด้วยวิธีนี้คุณจะได้รับการแทนที่ที่ดีบนวัตถุตอบสนองจริง

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

1
สิ่งที่ฉันต้องส่งสำหรับอาร์กิวเมนต์แรก
Raghuveera

เพื่อนนี่เป็นทางออกที่ยอดเยี่ยมที่ใช้งานได้จริง! ขอบคุณ.
Klaus Nji

โซลูชันที่ใช้ซ้ำได้ยอดเยี่ยม! ข้อเสียเพียงอย่างเดียวคือหน้าต่างใหม่ถูกบล็อกโดยตัวป้องกันป๊อปอัป
MeanGreen

อาร์กิวเมนต์แรกคืออ็อบเจ็กต์การตอบสนองปัจจุบันของคุณ
Futureproof

ขอบคุณสำหรับคำติชม!
Sasa Tancev

26

เนื่องจาก Response.Redirect เริ่มต้นบนเซิร์ฟเวอร์คุณไม่สามารถทำได้โดยใช้สิ่งนั้น

หากคุณสามารถเขียนลงในสตรีมการตอบกลับได้โดยตรงคุณสามารถลองทำสิ่งต่อไปนี้:

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

3
งานนี้ แต่หน้าเว็บที่ปุ่มของฉันได้รับการเปลี่ยนแปลงเช่น CSS หรือ DIVS กำลังได้รับผลกระทบ
Etienne

หน้าต่างใหม่จะปรากฏขึ้นทุกครั้งเมื่อกลับไปกลับมา
devXen

26

สร้าง URL ของคุณผ่านตัวจัดการเหตุการณ์คลิก:

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

แล้ว:

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

ตัวป้องกันป๊อปอัปบล็อก url อื่น ๆ รอบนี้ ??
Rafay

3
window.open ในตัวอย่างนี้จะถือว่าเป็น 'popup' เสมอเนื่องจากเริ่มต้นด้วยโค้ดไม่ใช่การกระทำของผู้ใช้ ถ้า window.open ถูกเรียกเมื่อผู้ใช้คลิกที่องค์ประกอบนั่นควรหลีกเลี่ยงการดำเนินการป๊อปอัปที่ถูกบล็อกโดยเบราว์เซอร์
สตีฟ

@steve นี่เป็นวิธีที่ยอดเยี่ยมและง่ายมาก ฉันใช้แนวทางของคุณในการตอบกลับเปลี่ยนเส้นทางไปยังป๊อปอัป
Sunil

14

เคล็ดลับการแก้ไขนั้นเรียบร้อย แต่:

  1. คุณอาจไม่มีสิทธิ์เข้าถึงรหัสของสิ่งที่โหลดในหน้าต่างใหม่

  2. แม้ว่าคุณจะทำ แต่คุณก็ขึ้นอยู่กับว่ามันโหลดได้ตลอดเวลาโดยไม่มีข้อผิดพลาด

  3. และคุณขึ้นอยู่กับข้อเท็จจริงที่ว่าผู้ใช้จะไม่คลิกปุ่มอื่นก่อนที่หน้าอื่นจะมีโอกาสโหลดและเรียกใช้โปรแกรมฟิกซ์ฟอร์ม

ฉันขอแนะนำให้ทำสิ่งนี้แทน:

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

และตั้งค่า fixform ในหน้าเดียวกันโดยมีลักษณะดังนี้:

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

11

คุณยังสามารถใช้ในโค้ดด้านหลังได้ด้วยวิธีนี้

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

2
วิธีนี้ใช้ได้ดีสำหรับฉันและโดยพื้นฐานแล้วเป็นเวอร์ชันสั้น ๆ ของโซลูชันของ Abhishek Shrivastava ด้านบน อย่างไรก็ตามมีข้อควรระวังสองประการที่ต้องระวัง ขั้นแรกสิ่งนี้จะทริกเกอร์ตัวบล็อกป๊อปอัป โดยเฉพาะอย่างยิ่งจะใช้ไม่ได้เลยใน Safari 5.0 หากเปิดใช้งานตัวป้องกันป๊อปอัปเนื่องจาก Safari ไม่แจ้งให้คุณทราบถึงป๊อปอัปที่ถูกบล็อกและไม่อนุญาตให้คุณสร้างข้อยกเว้นป๊อปอัป ประการที่สอง Chrome จะละเว้นอาร์กิวเมนต์ของหน้าไปที่ window.open ดังนั้นแม้ว่าคุณจะใช้window.open('page.aspx','_blank');มันก็ยังคงเปิดอยู่ในหน้าต่างใหม่โดยปิดใช้งานแถบนำทางและปุ่มนำทางหายไปแทนที่จะเป็นแท็บใหม่
Kasey Speakman

8

สิ่งนี้ไม่สามารถทำได้ด้วย Response.Redirect เนื่องจากเกิดขึ้นที่ฝั่งเซิร์ฟเวอร์และไม่สามารถสั่งให้เบราว์เซอร์ของคุณดำเนินการดังกล่าวได้ อะไรจะเหลืออยู่ในหน้าต่างเริ่มต้น? หน้าว่าง?


8

วิธีการป๊อปอัปจะให้คำถามที่ปลอดภัยแก่ผู้เยี่ยมชม ..

นี่คือวิธีง่ายๆของฉัน: และทำงานได้ทุกที่

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

ฉันไม่สามารถแก้ไข yout โพสต์ที่ไม่ใช่ 6 ตัวอักษรเป็นอย่างน้อย แต่ไม่ใช่ "(" href ")" มันคือ "[" href "]"
Nickso


4

หากคุณสามารถจัดโครงสร้างโค้ดของคุณใหม่โดยที่คุณไม่จำเป็นต้องโพสต์แบ็คคุณสามารถใช้โค้ดนี้ในเหตุการณ์ PreRender ของปุ่ม:

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

4

คุณยังสามารถใช้รหัสต่อไปนี้เพื่อเปิดหน้าใหม่ในแท็บใหม่

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

และเพียงแค่เรียก Response.Redirect ("yourPage.aspx"); เบื้องหลังเหตุการณ์ปุ่ม


วิธีการนี้จะเรียกทั้งOnClientClickเช่นเดียวกับonclick หมายถึงมีการเปิดหน้าบางหน้าในหน้าต่างใหม่และมีการดำเนินการบางอย่างในหน้าเดียวกัน
Manivannan Nagarajan

3

ฉันใช้รหัสนี้เสมอ ... ใช้รหัสนี้

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

โค้ดนี้จะไม่มีผลกับคลาส CSS ดังนั้นหน้าต่างหลักจะไม่ได้รับผลกระทบเลย !!
Abhishek Shrivastava

1
นี่เป็นข้อโต้แย้งที่ชัดเจนสำหรับ MVC อย่านำอะไรออกไปจากรหัสของคุณ ไกลจากมัน. มันเป็นแบบนี้ที่ทำให้เว็บฟอร์มเป็นแบบนี้
MrBoJangles

รหัสทั้งหมดนี้สามารถย่อเป็นบรรทัดเดียว ... ดูวิธีแก้ปัญหาของ shalu ด้านล่าง มันให้ผลเหมือนกันทุกประการ แต่ไม่มีการขยายตัวที่ไม่จำเป็นทั้งหมด
Kasey Speakman

1

นี่คือเวอร์ชัน jQuery ตามคำตอบของ @takrl และ @tom ด้านบน หมายเหตุ: ไม่มีฟอร์มิดแบบฮาร์ดโค้ด (ชื่อ aspnetForm ด้านบน) และยังไม่ใช้การอ้างอิงแบบตรงเป้าหมายซึ่ง Firefox อาจพบว่ามีปัญหา:

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

จากนั้นในไฟล์ js ของคุณที่อ้างอิงในเพจ SAME:

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

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

1

ฉันใช้ไฮเปอร์ลิงค์แทน LinkButton และมันก็ใช้งานได้ดีมีคุณสมบัติ Target ดังนั้นมันจึงแก้ปัญหาของฉันได้ มีวิธีแก้ปัญหาด้วย Response.Write แต่นั่นทำให้เลย์เอาต์ของฉันยุ่งเหยิงและอันที่มี ScriptManager ทุกครั้งที่รีเฟรชหรือย้อนกลับกำลังเปิดหน้าต่างอีกครั้ง นี่คือวิธีที่ฉันแก้ไข:

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

0

คุณอาจต้องการใช้ Page.RegisterStartupScript เพื่อให้แน่ใจว่าจาวาสคริปต์เริ่มทำงานเมื่อโหลดเพจ


0

คุณสามารถเปิดหน้าต่างใหม่จากรหัส asp.net ที่อยู่เบื้องหลังโดยใช้ ajax เหมือนที่ฉันทำที่นี่ 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

ไม่มีตัวอย่างก่อนหน้านี้ที่ใช้ได้ผลสำหรับฉันฉันจึงตัดสินใจโพสต์วิธีแก้ปัญหาของฉัน ในเหตุการณ์คลิกปุ่มนี่คือรหัสที่อยู่เบื้องหลัง

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

ฉันต้องแก้ไขโค้ด response.redirect ของคนอื่นเพื่อเปิดในเบราว์เซอร์ใหม่


0

ฉันใช้วิธีนี้ไม่ต้องการให้คุณทำอะไรในป๊อปอัป (ซึ่งฉันไม่สามารถเข้าถึงได้เพราะฉันกำลังเปลี่ยนเส้นทางไปยังไฟล์ PDF) นอกจากนี้ยังใช้คลาส

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

หากต้องการใช้ให้เพิ่มคลาส "new-window" ให้กับองค์ประกอบใด ๆ คุณไม่จำเป็นต้องเพิ่มอะไรลงในแท็กร่างกาย ฟังก์ชันนี้จะตั้งค่าหน้าต่างใหม่และแก้ไขในฟังก์ชันเดียวกัน


0

ฉันทำได้โดยใส่ target = "_ blank" ในปุ่มลิงก์

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

จากนั้นใน codebehind pageload เพียงแค่ตั้งค่าแอตทริบิวต์ 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";}

และรหัสหลัง:

Response.Redirect(URL); 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.