Response.Redirect到新窗口
我想做一个Response.Redirect("MyPage.aspx")
但它打开一个新的浏览器窗口。 我之前没有使用JavaScript注册脚本方法。 我只是不记得如何?
我刚刚find答案,它的作品:)
您需要将以下内容添加到您的服务器端链接/button:
OnClientClick="aspnetForm.target ='_blank';"
我的整个button代码如下所示:
<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()">
你可以使用这个扩展方法
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对象上获得很好的覆盖
Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");
因为Response.Redirect是在服务器上启动的,所以无法使用它。
如果您可以直接写入响应stream,您可以尝试如下所示:
response.write("<script>"); response.write("window.open('page.html','_blank')"); response.write("</script>");
通过点击事件处理程序构build您的url:
string strUrl = "/some/url/path" + myvar;
然后:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
固定的技巧是整洁的,但是:
-
您可能无法访问在新窗口中加载的代码。
-
即使你这样做,你也依赖于它始终加载,没有错误的事实。
-
而且你要依靠用户在另一个页面有机会加载并运行fixform之前不会点击另一个button。
我会build议这样做:
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);
Response.Redirect在服务器端发生这种情况是不可能的,并且不能指挥你的浏览器去执行这个动作。 什么会留在最初的窗口? 空白页面?
popup方法将给访问者一个安全的问题..
这是我简单的解决scheme:和工作的任何地方。
<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/
如果您可以重新构build代码,以便不需要回发,则可以在button的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”); button事件后面。
我总是使用这个代码… 使用这个代码
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 ()); }
这是一个基于@takrl和@tom上面的答案的jQuery版本。 注意:没有硬编码的formid(上面命名为aspnetForm),也不使用Firefox可能会发现的直接form.target引用问题:
<asp:Button ID="btnSubmit" OnClientClick="openNewWin();" Text="Submit" OnClick="btn_OnClick" runat="server"/>
然后在你的js文件在同一页上引用:
function openNewWin () { $('form').attr('target','_blank'); setTimeout('resetFormTarget()', 500); } function resetFormTarget(){ $('form').attr('target',''); }
我用超链接而不是LinkButton,它工作得很好,它有Target属性,所以它解决了我的问题。 有Response.Write的解决scheme,但这是搞乱我的布局,并与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来确保JavaScript在页面加载时触发。
你可以从后面的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); }
以前的例子都不适合我,所以我决定发布我的解决scheme。 在button点击事件,这里是后面的代码。
Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString URL = Page.ResolveClientUrl(URL) btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"
我不得不修改别人的response.redirect代码在新的浏览器中打开。
我使用这种方法,它不需要你在popup窗口上做任何事情(我没有访问,因为我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”添加到任何元素。 你不需要添加任何东西到身体标签。 这个函数设置新的窗口,并将其修复为相同的function。
我通过在linkbutton中放置target =“_ blank”来做到这一点
<asp:LinkButton ID="btn" runat="server" CausesValidation="false" Text="Print" Visible="false" target="_blank" />
那么在代码隐藏pageload中只需设置href属性:
btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId={0}", formId)