ฉันต้องการทำResponse.Redirect("MyPage.aspx")
แต่เปิดในหน้าต่างเบราว์เซอร์ใหม่ ฉันเคยทำสิ่งนี้มาก่อนโดยไม่ใช้วิธีการลงทะเบียนสคริปต์ JavaScript ฉันจำไม่ได้ว่าอย่างไร?
ฉันต้องการทำResponse.Redirect("MyPage.aspx")
แต่เปิดในหน้าต่างเบราว์เซอร์ใหม่ ฉันเคยทำสิ่งนี้มาก่อนโดยไม่ใช้วิธีการลงทะเบียนสคริปต์ JavaScript ฉันจำไม่ได้ว่าอย่างไร?
คำตอบ:
ฉันเพิ่งพบคำตอบและใช้งานได้ :)
คุณต้องเพิ่มสิ่งต่อไปนี้ในลิงค์ / ปุ่มฝั่งเซิร์ฟเวอร์ของคุณ:
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()">
OnClientClick="aspnetForm.target ='_blank';"
ต้องใช้OnClientClick="document.getElementById('Form').target ='_blank';"
คุณสามารถใช้เป็นวิธีการขยาย
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");
เนื่องจาก Response.Redirect เริ่มต้นบนเซิร์ฟเวอร์คุณไม่สามารถทำได้โดยใช้สิ่งนั้น
หากคุณสามารถเขียนลงในสตรีมการตอบกลับได้โดยตรงคุณสามารถลองทำสิ่งต่อไปนี้:
response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
สร้าง URL ของคุณผ่านตัวจัดการเหตุการณ์คลิก:
string strUrl = "/some/url/path" + myvar;
แล้ว:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
เคล็ดลับการแก้ไขนั้นเรียบร้อย แต่:
คุณอาจไม่มีสิทธิ์เข้าถึงรหัสของสิ่งที่โหลดในหน้าต่างใหม่
แม้ว่าคุณจะทำ แต่คุณก็ขึ้นอยู่กับว่ามันโหลดได้ตลอดเวลาโดยไม่มีข้อผิดพลาด
และคุณขึ้นอยู่กับข้อเท็จจริงที่ว่าผู้ใช้จะไม่คลิกปุ่มอื่นก่อนที่หน้าอื่นจะมีโอกาสโหลดและเรียกใช้โปรแกรมฟิกซ์ฟอร์ม
ฉันขอแนะนำให้ทำสิ่งนี้แทน:
OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);"
และตั้งค่า fixform ในหน้าเดียวกันโดยมีลักษณะดังนี้:
function fixform() {
document.getElementById("aspnetForm").target = '';
}
คุณยังสามารถใช้ในโค้ดด้านหลังได้ด้วยวิธีนี้
ClientScript.RegisterStartupScript(this.Page.GetType(), "",
"window.open('page.aspx','Graph','height=400,width=500');", true);
window.open('page.aspx','_blank');
มันก็ยังคงเปิดอยู่ในหน้าต่างใหม่โดยปิดใช้งานแถบนำทางและปุ่มนำทางหายไปแทนที่จะเป็นแท็บใหม่
สิ่งนี้ไม่สามารถทำได้ด้วย Response.Redirect เนื่องจากเกิดขึ้นที่ฝั่งเซิร์ฟเวอร์และไม่สามารถสั่งให้เบราว์เซอร์ของคุณดำเนินการดังกล่าวได้ อะไรจะเหลืออยู่ในหน้าต่างเริ่มต้น? หน้าว่าง?
วิธีการป๊อปอัปจะให้คำถามที่ปลอดภัยแก่ผู้เยี่ยมชม ..
นี่คือวิธีง่ายๆของฉัน: และทำงานได้ทุกที่
<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();"/>
<asp:Button ID="btnNewEntry" runat="Server" CssClass="button" Text="New Entry"
OnClick="btnNewEntry_Click" OnClientClick="aspnetForm.target ='_blank';"/>
protected void btnNewEntry_Click(object sender, EventArgs e)
{
Response.Redirect("New.aspx");
}
ที่มา: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/
หากคุณสามารถจัดโครงสร้างโค้ดของคุณใหม่โดยที่คุณไม่จำเป็นต้องโพสต์แบ็คคุณสามารถใช้โค้ดนี้ในเหตุการณ์ PreRender ของปุ่ม:
protected void MyButton_OnPreRender(object sender, EventArgs e)
{
string URL = "~/MyPage.aspx";
URL = Page.ResolveClientUrl(URL);
MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}
คุณยังสามารถใช้รหัสต่อไปนี้เพื่อเปิดหน้าใหม่ในแท็บใหม่
<asp:Button ID="Button1" runat="server" Text="Go"
OnClientClick="window.open('yourPage.aspx');return false;"
onclick="Button3_Click" />
และเพียงแค่เรียก Response.Redirect ("yourPage.aspx"); เบื้องหลังเหตุการณ์ปุ่ม
ฉันใช้รหัสนี้เสมอ ... ใช้รหัสนี้
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 ());
}
นี่คือเวอร์ชัน 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','');
}
ฉันใช้ไฮเปอร์ลิงค์แทน 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>
คุณอาจต้องการใช้ Page.RegisterStartupScript เพื่อให้แน่ใจว่าจาวาสคริปต์เริ่มทำงานเมื่อโหลดเพจ
คุณสามารถเปิดหน้าต่างใหม่จากรหัส 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);
}
ไม่มีตัวอย่างก่อนหน้านี้ที่ใช้ได้ผลสำหรับฉันฉันจึงตัดสินใจโพสต์วิธีแก้ปัญหาของฉัน ในเหตุการณ์คลิกปุ่มนี่คือรหัสที่อยู่เบื้องหลัง
Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"
ฉันต้องแก้ไขโค้ด response.redirect ของคนอื่นเพื่อเปิดในเบราว์เซอร์ใหม่
ฉันใช้วิธีนี้ไม่ต้องการให้คุณทำอะไรในป๊อปอัป (ซึ่งฉันไม่สามารถเข้าถึงได้เพราะฉันกำลังเปลี่ยนเส้นทางไปยังไฟล์ 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" ให้กับองค์ประกอบใด ๆ คุณไม่จำเป็นต้องเพิ่มอะไรลงในแท็กร่างกาย ฟังก์ชันนี้จะตั้งค่าหน้าต่างใหม่และแก้ไขในฟังก์ชันเดียวกัน
ฉันทำได้โดยใส่ 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)
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);