我看到我的javascript和页面后面的代码之间有一些奇怪的交互。这是页面:
<form name="form1" id="form1" runat="server">
<button onclick="submitForm()">Submit Form</button>
<asp:LinkButton runat="server" OnClick="btn_download">Download!</asp:LinkButton>
</form>
<script type="text/javascript">
function submitForm()
{
document.form1.submit();
}
</script>
和背后的代码:
protected void btn_download(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", String.Concat("attachment; filename=", "download.txt"));
string hw = "hello world!";
byte[] info = new byte[hw.Length * sizeof(char)];
System.Buffer.BlockCopy(hw.ToCharArray(), 0, info, 0, info.Length);
Response.OutputStream.Write(info, 0, info.Length);
Response.Flush();
Response.End();
}
当我点击下载按钮时,我按预期获得了一个文件。点击下载后,如果我点击提交表单按钮,表单就会被提交,但就像下载被按下一样 - 触发btn_download方法。如果我注释掉btn_download(..)中的代码,则不会发生这种情况。
如果在点击下载按钮之前点击提交表单按钮,则不会触发btn_download。我尝试逐行注释掉后面的代码,看起来Response.appendHeader(..)行导致了问题。有人能解释一下这里发生了什么吗?为什么form1.submit()就像我点击下载一样?
答案 0 :(得分:2)
对于ASP.NET Web表单,您应该避免使用form.submit()
提交表单。相反,您应该调用__doPostback
传递触发回发的控件的名称。否则,您将混淆ASP.NET基础结构,该基础结构会确定哪个按钮或事件触发了表单的提交。
从服务器的角度来看,ASP.NET不知道如何提交表单(无论是按钮还是Javascript代码),而不是检查隐藏的表单变量&#34; EVENTTARGET&#34 ;当您首先单击下载按钮时,doPostBack
将填充事件目标,然后提交表单;如果您然后直接调用submit
,则事件目标字段仍然会在doPostBack
调用的剩余时间内显示一个值。因此,ASP.NET认为您再次单击了下载按钮。
有关详细信息,请参阅Article: How to use doPostBack