【问题标题】:Using Window.Open instead of Response.Redirect to open new window?使用 Window.Open 而不是 Response.Redirect 打开新窗口?
【发布时间】:2013-07-16 14:39:33
【问题描述】:

我的页面代码如下所示:

<asp:Button ID="btnSearch" runat="server" Text="Search" onclick="btnSearch_Click"/>

我的方法是这样的:

protected void btnSearch_Click(object sender, EventArgs e)
    {
        var value = lblGraphicNameValue.Text.ToString();
        Response.Redirect("Search.aspx?txtGraphicName=" +
                           value);
    }

目前,当用户按下“搜索”按钮时,页面会刷新并加载 Search.aspx 页面。我想要做的是让 Search.aspx 在新窗口中打开,而不是。我看过使用 Window.Open,但我不确定这是否是正确的路线,或者我是否可以使用相同的方法来传递我的变量(查询字符串)。有人可以指出我正确的方向吗?我有什么作品,我只是希望它在新页面中打开,而前一页则不受影响。

编辑:我应该提到我不能使用 javascript(安全环境,每个浏览器都禁用了 javascript)。

从我正在阅读的内容来看,这似乎表明如果没有 javascript,从 asp.net 页面中打开一个新网页并传入 parms 是不可行的?这是正确的吗?

【问题讨论】:

  • 不使用 JavaScript 就没有办法做到这一点吗?我们在关闭 JS 的非常安全的环境中工作。我们所有的软件都是内部开发的,供内部使用。所以,我的难题是我不能使用 javascript。真的没有办法在没有JS的asp.net页面中打开一个传入参数的新网页吗?
  • "每个浏览器都禁用了 javascript" -- 那么您到底是如何使用 .NET 的呢? ASP:Button 需要 Javascript 才能运行。你确定 JS 被禁用了,还是你只是有一个约束不能添加不是由框架生成的自定义 JS??
  • 格雷厄姆,可能是这样。我们被告知不要使用任何 javascript 代码。

标签: c# asp.net


【解决方案1】:

下面的这段代码最终完全符合我的需要:

<a href="<%= this.ResolveUrl("Search.aspx?id=" + lblGraphicNameValue.Text.Remove(lblGraphicNameValue.Text.Length -4)) %>"
                                                                                target="_blank">Search Related</a>

这段代码做了三件事:

  • 1) 在新页面中打开搜索。
  • 2) 将搜索值截断四 字符(我只需要搜索字符串的一部分)
  • 3) 传球 新页面的参数。

这完全实现了我所需要的,而无需借助自定义类或 javascript,尽管它确实让我不得不使用链接而不是按钮。

【讨论】:

    【解决方案2】:

    使用这个类。

    ResponseHelper .Redirect("popup.aspx", "_blank", "menubar=0,width=100,height=100");
    
    
    
    public static class ResponseHelper {
    public static void Redirect(string url, string target, string windowFeatures) {
        HttpContext context = HttpContext.Current;
    
        if ((String.IsNullOrEmpty(target) ||
            target.Equals("_self", StringComparison.OrdinalIgnoreCase)) &&
            String.IsNullOrEmpty(windowFeatures)) {
    
            context.Response.Redirect(url);
        }
        else {
            Page page = (Page)context.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);
        }
    }
    

    }

    【讨论】:

      【解决方案3】:

      我认为您在正确的轨道上,但是您混淆了服务器端代码和客户端代码。 window.open 是一个在客户端工作的 Javascript 函数。所以你需要从 C# 渲染一些 Javascript 来弹出窗口。试试:

      protected void btnSearch_Click(object sender, EventArgs e)
      {
          var value = lblGraphicNameValue.Text.ToString();
          ClientScript.RegisterStartupScript(this.GetType(), "newWindow", String.Format("<script>window.open('Search.aspx?txtGraphicName={0}');</script>", value));
      }
      

      这将重新渲染页面,然后在页面加载时添加一个脚本,该脚本将弹出窗口。一点警告,这可能会被浏览器弹出窗口阻止程序阻止。如果您想解决这个问题,您可能无需使用 Javascript 发回服务器即可实现此目的。

      【讨论】:

      • 正如@alergy 指出的那样,已经有一个问题了。接受的答案可能会绕过弹出窗口阻止程序。
      • 我查看了@alergy 指出的线程,但它使用了javascript。如果可以的话,我会尽量避免这种情况。我们的网站是安全的,不允许启用 javascript。
      • @JavaRox 好吧,在这种情况下,window.open 将不起作用。您可能需要考虑使用 HTML 属性 target="_blank"。但是正确地实现这一点对于网络表单来说将是一个挑战,因为只有一个全局&lt;form&gt; 标记并且不能嵌套。 stackoverflow.com/a/896731/254973
      • @JavaRox,最简单的解释方式是,在 Web 服务器上运行的代码与您的浏览器完全分离。服务器只需通过 IIS 接收请求,执行您的 .NET 代码,然后根据您的 Page 类和标记发回 HTML 响应。服务器本身没有弹出窗口、“新”窗口或选项卡的概念。它只是Request => Response。由用户代理(浏览器)决定何时/如何产生弹出窗口、新窗口等。这就是 JavaScript 的用武之地。
      • 我敦促您复习 ASP.NET MVC,因为它以更加透明的方式展示了这一现实。
      【解决方案4】:

      更好的选择是创建一个 javascript 函数,例如:

          function PreviewPOSTransaction(Id)
          {
      
              if (Id != null)
              { 
      
                  window.open('POSTransReport.aspx?TransID=' + Id);
                  return true;
              }
          }
      
      </script>
      

      并在按钮“OnClientClick”事件上调用此函数,例如:

      OnClientClick="PreviewPOSTransaction(1);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        • 2013-11-29
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多