在linkbutton回发后提交表单

时间:2016-08-17 22:16:49

标签: javascript asp.net

我看到我的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()就像我点击下载一样?

1 个答案:

答案 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