2012-11-27 22 views
0

在服務器端後,我有這樣的代碼:設置一個hiddenfield爲「不變」 OnValueChanged

protected void DownloadExcel(object sender, EventArgs e) 
    { 
     byte[] arrayExcel = Convert.FromBase64String(reportBase64.Value); 
     HttpContext.Current.Response.ClearContent(); 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.ClearHeaders(); 
     HttpContext.Current.Response.AppendHeader("content-length", arrayExcel.Length.ToString()); 
     HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=excelName.xls"); 
     HttpContext.Current.Response.ContentType = "application/Excel"; 
     HttpContext.Current.Response.BinaryWrite(arrayExcel); 
     HttpContext.Current.Response.End(); 
     HttpContext.Current.Response.Close(); 
     HttpContext.Current.Response.Flush(); 
    } 

此方法綁定到一個「OnValueChanged」這是由這個小JS觸發的事件:

self.getExcel = function (stringBase64) { 
    $("#hiddenFiedlName").val(stringBase64).change(); 
    __doPostBack(); 
} 

第一次觸發事件後,它會在每次回發時觸發。我認爲這種奇怪的行爲發生是因爲由js代碼修改的「更改觸發器」未被真正的回發清除。

現在,我的假設是正確的嗎?如果是這樣,有沒有辦法以編程方式清除這個「更改」觸發器?

謝謝

EDIT1:在「每一個回發」我寫的都是由其他按鈕在同一頁面中觸發其他文件下載。

+0

我想這個問題可能在這裏:http://api.jquery.com/change/「對於選擇框,複選框和單選按鈕,當用戶使用鼠標進行選擇時,會立即觸發該事件,但對於其他元素類型,事件被推遲到元素失去焦點。「我不知道如何處理隱藏字段 – jbl

+0

事件沒有任何問題被解僱。事實是,當隱藏域沒有改變時也會觸發它。 – Abaco

+1

我想知道爲什麼你需要.change()。不會設置值並調用__doPostBack就夠了嗎?另外,您的HiddenFields是否啓用了ViewState?我猜他們應該。 – jbl

回答

1

這個問題有點棘手,但我設法解決它。

事實是:如果不執行真正的回傳(與文件響應不考慮的話)的價值仍然被認爲是「改變」

解決此問題的唯一方法似乎是手動「重置」隱藏字段的值。

我想出了這一點:

self.getExcel = function (stringBase64) { 
    $("#hiddenFiedlName").val(stringBase64); 
    __doPostBack(); 
    $("#hiddenFieldName").val(""); 
} 

值恢復到初始的一個回傳後(這始終是空字符串)。通過這樣做,「ValueChanged」事件不會被觸發。

正如jbl的評論中所述,change()是無用的(請參閱他對問題的評論)。