避免在向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。
我无法使用您的代码重新创建问题,因此更多的上下文可能会有所帮助。根据页面其余部分的结构,您可以使用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重置表单的目标属性,以便应用程序在返回后仍能正常工作。