C# 使用Window.Open代替Response.Redirect打开新窗口?

C# 使用Window.Open代替Response.Redirect打开新窗口?,c#,asp.net,C#,Asp.net,我的页面代码如下所示: <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

我的页面代码如下所示:

<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,但我不确定这是否是正确的路由,或者是否可以使用相同的方法传递变量(querystring)。有人能给我指出正确的方向吗?我的作品,我只想它打开一个新的页面,而离开前一页单独

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

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

使用此类

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

}

我认为您的方法是正确的,但是您混淆了服务器端代码和客户端代码
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));
}
protectedvoidbtnsearch\u单击(对象发送方,事件参数e)
{
var value=lblgraphicalnamevalue.Text.ToString();
ClientScript.RegisterStartupScript(this.GetType(),“newWindow”,String.Format(“window.open('Search.aspx?txtGraphicName={0}”);”,value));
}

这将重新呈现页面,然后在pageload上添加一个脚本,该脚本将弹出窗口。有一点警告,这可能会被浏览器弹出窗口阻止程序阻止。如果您想绕过这一点,您可能不需要使用Javascript发回服务器就可以实现这一点。

下面的代码最终实现了我所需要的功能:

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

此代码有三个功能:

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

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

更好的选择是创建如下javascript函数:

    function PreviewPOSTransaction(Id)
    {

        if (Id != null)
        { 

            window.open('POSTransReport.aspx?TransID=' + Id);
            return true;
        }
    }

</script>

function PreviewPOSTransaction(Id)
{
如果(Id!=null)
{ 
open('POSTransReport.aspx?TransID='+Id);
返回true;
}
}
并在按钮“OnClientClick”事件上调用此函数,如:


OnClientClick=“PreviewPOSTransaction(1)

如果不使用JavaScript,就没有办法做到这一点吗?我们在关闭JS的情况下在一个非常安全的环境中工作。我们所有的软件都是在内部开发的,供内部使用。因此,我的难题是我不能使用JavaScript。实际上,没有办法在asp.net页面中打开带有传入参数的新网页没有JS?“每个浏览器都禁用了javascript“--那你到底是怎么使用.NET的呢?ASP:按钮需要Javascript才能运行。你确定JS被禁用了,或者你只是有一个不能添加非框架生成的自定义JS的约束??Graham,可能就是这样。我们被告知不要使用任何javascript代码。正如@alergy指出的,已经有一个问题了。接受的答案可能会绕过弹出窗口拦截器。我看过@alergy提到的线程,但它使用javascript。如果可以的话,我会尽量避开的。我们的网站是安全的,不允许启用javascript。@JavaRox在这种情况下,
window.open
将无法工作。您可能需要研究如何使用HTML属性
target=“\u blank”
。但是要正确地实现这一点对于webforms来说是一个挑战,因为只有一个全局
标记,不能嵌套@JavaRox,最简单的解释方式是,在web服务器上运行的代码完全与浏览器分离。服务器只需通过IIS接收请求,执行.NET代码,然后根据页面类和标记发回HTML响应。服务器本身没有弹出窗口、“新”窗口或选项卡的概念。它只是
请求
=>
响应
。由用户代理(浏览器)决定何时/如何生成弹出窗口、新窗口等。这就是JavaScript的用武之地。我敦促您重新学习ASP.NETMVC,因为它以一种更加透明的方式展示了这一现实。