3

所以这是一个很长的标题,这就是我正在做的事情:为了避免在 URL 中显示报告参数,我在代码隐藏中的按钮单击处理程序中执行此操作以显示报告:

System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.Write("<html><head></head>");    
System.Web.HttpContext.Current.Response.Write("<body onload=\"document.mainform.submit(); \">");
System.Web.HttpContext.Current.Response.Write(string.Format(CultureInfo.InvariantCulture, "<form name=\"mainform\" method=\"post\" action=\"{0}\">", ReportURL));
foreach (string key in Params.Keys)
{
    System.Web.HttpContext.Current.Response.Write(string.Format(CultureInfo.InvariantCulture, "<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", key, Params[key]));
}
System.Web.HttpContext.Current.Response.Write("</form>");
System.Web.HttpContext.Current.Response.Write("</body></html>");

这很好用,但是当我从报告返回时,我被带到我刚刚生成的页面,该页面由于 onload 事件而立即提交表单。我可以快速回击两次以绕过它,但这并不理想。

在编写 html 之前,我尝试使用 ClientScript.RegisterStartupScript 使用 JavaScript 打开一个新窗口,但我不知道如何(或者是否有可能)为新窗口获取 HttpContext。

4

2 回答 2

0

我最终打开了一个新窗口。我添加了两个小的 javascript 函数

function openNewWin() {
    $('form').attr('target', '_blank');
    setTimeout('resetFormTarget()', 500);
}

function resetFormTarget() {
    $('form').attr('target', '');
}

然后在我设置的链接按钮中

OnClientClick="openNewWin();"

OnClick 仍然在服务器端执行上面的代码,但响应被写入新窗口。openNewWin 函数中的 setTimeout 会重置表单的目标属性,因此应用程序在返回到它后仍能正常运行。

于 2012-06-15T00:22:01.020 回答
0

我无法使用您的代码重新创建问题,因此更多上下文可能会有所帮助。根据页面其余部分的结构,您可以使用 PostbackURL 而不是点击处理程序:

<form id="form1" runat="server">
    <asp:HiddenField runat="server" ID="Key1" Value="Value1"/>
    <asp:HiddenField runat="server" ID="Key2" Value="Value2"/>
    <asp:Button runat="server" ID="button"
        Text="ok" PostBackUrl="ReportURL.aspx"/>
</form>

这样您就不必担心浏览器历史记录中的额外/替换页面。

于 2012-04-06T18:29:51.687 回答