2016-08-17 58 views
1

我看到我的JavaScript和頁面後面的代碼之間的一些奇怪的交互。這裏是頁面:linkbutton回發後提交表單

<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()的行爲就像我點擊下載一樣?

回答

2

對於ASP.NET Web表單,您應該避免使用form.submit()提交表單。相反,您應該調用__doPostback傳遞觸發回發的控件的名稱。否則,你會混淆ASP.NET基礎結構,它會指出哪個按鈕或事件觸發了表單的提交。

從服務器的角度來看,除了檢查隱藏的表單變量「EVENTTARGET」之外,ASP.NET不知道表單是如何提交的(無論是按鈕還是Javascript代碼)當您先單擊下載按鈕,doPostBack填充事件目標,然後提交表單;如果您直接撥打submit,事件目標字段仍然有一個值,該值來自doPostBack呼叫剩餘的值。因此,ASP.NET認爲您再次單擊下載按鈕。

欲瞭解更多信息,請參閱Article: How to use doPostBack