【发布时间】:2010-09-11 09:37:53
【问题描述】:
我想做一个Response.Redirect("MyPage.aspx"),但要在新的浏览器窗口中打开它。我之前没有使用 JavaScript 注册脚本方法就完成了这项工作。我只是不记得怎么做?
【问题讨论】:
标签: c# asp.net response.redirect
我想做一个Response.Redirect("MyPage.aspx"),但要在新的浏览器窗口中打开它。我之前没有使用 JavaScript 注册脚本方法就完成了这项工作。我只是不记得怎么做?
【问题讨论】:
标签: c# asp.net response.redirect
HTML
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" OnClientClick = "SetTarget();" />
Javascript:
function SetTarget() {
document.forms[0].target = "_blank";}
AND 代码隐藏:
Response.Redirect(URL);
【讨论】:
我通过将 target="_blank" 放在链接按钮中来做到这一点
<asp:LinkButton ID="btn" runat="server" CausesValidation="false" Text="Print" Visible="false" target="_blank" />
然后在代码隐藏页面加载中设置 href 属性:
btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId={0}", formId)
【讨论】:
弹出方法会给访问者一个安全的问题..
这是我的简单解决方案:到处工作。
<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();"/>
【讨论】:
我使用了这种方法,它不需要您对弹出窗口执行任何操作(我无法访问,因为我正在重定向到 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”添加到任何元素。您不需要向 body 标记添加任何内容。此函数设置新窗口并将其固定在同一函数中。
【讨论】:
前面的例子都不适合我,所以我决定发布我的解决方案。在按钮点击事件中,下面是代码。
Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"
我不得不修改其他人的 response.redirect 代码才能在新浏览器中打开。
【讨论】:
您也可以使用以下代码在新标签页中打开新页面。
<asp:Button ID="Button1" runat="server" Text="Go"
OnClientClick="window.open('yourPage.aspx');return false;"
onclick="Button3_Click" />
只需调用 Response.Redirect("yourPage.aspx");按钮事件后面。
【讨论】:
我刚刚找到了答案,它有效:)
您需要将以下内容添加到您的服务器端链接/按钮:
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';"
我使用 Hyperlink 而不是 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>
【讨论】:
这是基于上面@takrl 和@tom 的答案的jQuery 版本。注意:没有硬编码的 formid(上面命名为 aspnetForm),也没有使用 Firefox 可能会发现有问题的直接 form.target 引用:
<asp:Button ID="btnSubmit" OnClientClick="openNewWin();" Text="Submit" OnClick="btn_OnClick" runat="server"/>
然后在你在SAME页面上引用的js文件中:
function openNewWin () {
$('form').attr('target','_blank');
setTimeout('resetFormTarget()', 500);
}
function resetFormTarget(){
$('form').attr('target','');
}
【讨论】:
通过点击事件处理程序构建您的网址:
string strUrl = "/some/url/path" + myvar;
然后:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
【讨论】:
如果您可以重新构造您的代码以便不需要回发,那么您可以在按钮的 PreRender 事件中使用此代码:
protected void MyButton_OnPreRender(object sender, EventArgs e)
{
string URL = "~/MyPage.aspx";
URL = Page.ResolveClientUrl(URL);
MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}
【讨论】:
fixform 技巧很巧妙,但是:
您可能无法访问代码 在新窗口中加载的内容。
即使你这样做了,你也依赖于 它总是加载的事实,错误 免费。
而你取决于事实 用户不会点击另一个 另一个页面获得之前的按钮 有机会加载和运行 fixform。
我建议改为这样做:
OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);"
并在同一页面上设置fixform,如下所示:
function fixform() {
document.getElementById("aspnetForm").target = '';
}
【讨论】:
<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/
【讨论】:
你可以用这个作为扩展方法
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");
【讨论】:
你可以open new window from asp.net code behind 使用 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);
}
【讨论】:
我总是使用这个代码... 使用此代码
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 ());
}
【讨论】:
你也可以像这样在后面的代码中使用
ClientScript.RegisterStartupScript(this.Page.GetType(), "",
"window.open('page.aspx','Graph','height=400,width=500');", true);
【讨论】:
window.open('page.aspx','_blank');,它仍会在禁用导航栏且缺少导航按钮而不是新标签的新窗口中打开它。
您可能希望使用 Page.RegisterStartupScript 来确保 javascript 在页面加载时触发。
【讨论】:
因为 Response.Redirect 是在服务器上启动的,所以您无法使用它来执行此操作。
如果您可以直接写入响应流,您可以尝试以下操作:
response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
【讨论】:
这在 Response.Redirect 中是不可能的,因为它发生在服务器端,并且无法引导您的浏览器执行该操作。初始窗口中会留下什么?空白页?
【讨论】: