【问题标题】:Response.Redirect to new window响应。重定向到新窗口
【发布时间】:2010-09-11 09:37:53
【问题描述】:

我想做一个Response.Redirect("MyPage.aspx"),但要在新的浏览器窗口中打开它。我之前没有使用 JavaScript 注册脚本方法就完成了这项工作。我只是不记得怎么做?

【问题讨论】:

    标签: c# asp.net response.redirect


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我通过将 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)
      

      【讨论】:

        【解决方案3】:

        弹出方法会给访问者一个安全的问题..

        这是我的简单解决方案:到处工作。

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

        【讨论】:

        • 我不能编辑你的帖子,因为至少不是 6 个字符,但它不是 '("href")',它是 '["href"]'
        【解决方案4】:

        我使用了这种方法,它不需要您对弹出窗口执行任何操作(我无法访问,因为我正在重定向到 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 标记添加任何内容。此函数设置新窗口并将其固定在同一函数中。

        【讨论】:

          【解决方案5】:

          前面的例子都不适合我,所以我决定发布我的解决方案。在按钮点击事件中,下面是代码。

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

          我不得不修改其他人的 response.redirect 代码才能在新浏览器中打开。

          【讨论】:

            【解决方案6】:

            您也可以使用以下代码在新标签页中打开新页面。

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

            只需调用 Response.Redirect("yourPage.aspx");按钮事件后面。

            【讨论】:

            • 此方法同时触发 OnClientClickonclick。意味着在新窗口中打开了一些页面,并且在同一页面中完成了一些操作
            【解决方案7】:

            我刚刚找到了答案,它有效:)

            您需要将以下内容添加到您的服务器端链接/按钮:

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

            【讨论】:

            • 不,因为它使用 javascript 来更改表单的目标。相反,该页面将正常提交。
            • 另外,如果您想重定向到虚拟目录之外的页面,您可能会违反安全规定。
            • 在我的情况下它不工作。我在新窗口中打开同一页面并写下对该页面的响应。但是,当我在母版页中保留 fixform() 方法时,它会抛出错误,说明文档为空。不知道为什么它仍然试图找到解决方案。虽然我通过使用 onClientClick="aspnetForm.target='';" 提出了一个临时解决方案该页面上其他按钮的属性。
            • 我刚试过这个,而不是OnClientClick="aspnetForm.target ='_blank';",我不得不使用OnClientClick="document.getElementById('Form').target ='_blank';"
            • 是的,它确实对我有用,但是它将页面打开到新标签而不是在新窗口中。如何在新窗口中打开我的页面?
            【解决方案8】:

            我使用 Hyperlink 而不是 LinkBut​​ton,它工作得很好,它具有 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>
            

            【讨论】:

              【解决方案9】:

              这是基于上面@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','');
              }
              

              【讨论】:

                【解决方案10】:

                通过点击事件处理程序构建您的网址:

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

                然后:

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

                【讨论】:

                • 弹出窗口拦截器会阻止 url 周围的任何其他 wa 吗??
                • window.open 在此示例中将始终被视为“弹出窗口”,因为它是由代码而不是用户操作启动的。如果 window.open 在用户点击一个元素时被调用,那应该回避浏览器阻止的弹出操作。
                • @steve,这是一个出色且非常简单的解决方案。我使用了您的 Response.Redirect 方法来弹出一个弹出窗口。
                【解决方案11】:

                如果您可以重新构造您的代码以便不需要回发,那么您可以在按钮的 PreRender 事件中使用此代码:

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

                【讨论】:

                  【解决方案12】:

                  fixform 技巧很巧妙,但是:

                  1. 您可能无法访问代码 在新窗口中加载的内容。

                  2. 即使你这样做了,你也依赖于 它总是加载的事实,错误 免费。

                  3. 而你取决于事实 用户不会点击另一个 另一个页面获得之前的按钮 有机会加载和运行 fixform。

                  我建议改为这样做:

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

                  并在同一页面上设置fixform,如下所示:

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

                  【讨论】:

                    【解决方案13】:
                    <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/

                    【讨论】:

                    • 它说 aspnetForm 是未定义的。
                    【解决方案14】:

                    你可以用这个作为扩展方法

                    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 对象。
                    • 感谢您的反馈!
                    【解决方案15】:

                    你可以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);
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      我总是使用这个代码... 使用此代码

                      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类所以父窗口根本不会受到影响!!
                      • 嗯,这无疑是 MVC 的有力论据。不要从你的代码中拿走任何东西。离得很远。这就是典型的网络表单,blech。
                      • 所有这些代码都可以压缩到一行...见下面shalu的解决方案。这是完全相同的效果,但没有所有不必要的膨胀。
                      【解决方案17】:

                      你也可以像这样在后面的代码中使用

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

                      【讨论】:

                      • 这对我来说很好,基本上是上面 Abhishek Shrivastava 解决方案的简短版本。但是,有一些注意事项需要注意。首先,这将触发弹出窗口阻止程序。特别是,如果启用了弹出窗口阻止程序,它将在 Safari 5.0 中根本不起作用,因为 Safari 不会提示您阻止弹出窗口并且不允许您制作弹出窗口异常。其次,Chrome 忽略了 window.open 的 page 参数。因此,即使您使用window.open('page.aspx','_blank');,它仍会在禁用导航栏且缺少导航按钮而不是新标签的新窗口中打开它。
                      【解决方案18】:

                      您可能希望使用 Page.RegisterStartupScript 来确保 javascript 在页面加载时触发。

                      【讨论】:

                        【解决方案19】:

                        因为 Response.Redirect 是在服务器上启动的,所以您无法使用它来执行此操作。

                        如果您可以直接写入响应流,您可以尝试以下操作:

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

                        【讨论】:

                        • 这项工作,但是我的按钮所在的页面发生了变化,就像 CSS 或 DIVS 受到了影响。
                        • 每次来回都会弹出新窗口。
                        【解决方案20】:

                        这在 Response.Redirect 中是不可能的,因为它发生在服务器端,并且无法引导您的浏览器执行该操作。初始窗口中会留下什么?空白页?

                        【讨论】:

                          猜你喜欢
                          • 2011-06-24
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-06-04
                          • 2013-05-29
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多