避免在向HttpContext.Current.Response写入带有onload=document.form.sub

本文关键字:onload document sub form HttpContext Response Current | 更新日期: 2023-09-27 18:30:07

所以这是一个很长的标题,下面是我要做的:为了避免报告参数显示在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。

避免在向HttpContext.Current.Response写入带有onload=document.form.sub

我无法使用您的代码重新创建问题,因此更多的上下文可能会有所帮助。根据页面其余部分的结构,您可以使用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>

这样,您就不必担心浏览器历史记录中有多余/被替换的页面。

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

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

然后在链接按钮中我设置

OnClientClick="openNewWin();"

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