我有一個從.NET的CompositeControl類繼承的自定義控件。此控件重寫CreateChildControls以便動態構建其子控件。在客戶端發生幾個不同的javascript事件後,我需要將頁面回發。無法從Value屬性的HtmlInputHidden獲取值
爲了做到這一點,我在頁面上創建兩個隱藏的控制,所以我可以用JavaScript設置它們的值,提交頁面,並且讀取的值出在服務器端。這裏是我用它來創建這兩個hiddens代碼:
Protected Overrides Sub CreateChildControls()
hdEventName = New HiddenField()
Controls.Add(hdEventName)
hdEventName.ID = "hdEventName"
hdEventArgs = New HiddenField()
Controls.Add(hdEventArgs)
hdEventArgs.ID = "hdEventValue"
' other controls
' ...
End Sub
當我設置兩個hiddens的價值屬性,並提交頁面,像這樣的js事件發生:
hdEventName.value = 'EventName';
hdEventArgs.value = 'arg1,arg2';
document.forms[0].submit();
在我的控件的OnLoad方法,我嘗試檢查hdEventName和hdEventArgs控件的Value屬性,但它始終爲空。但是,Page.Request.Form(hdEventName.UniqueID)和Page.Request.Form(hdEventArgs.UniqueID)返回正確的值。標記中的實際HTML也會在頁面回傳後顯示正確的值。
爲什麼HtmlInputHiddens的Value屬性從客戶端上顯示的實際值斷開?
更新 似乎控件的屬性會在OnLoad發生後的某個時間從窗體中加載。因此,我能夠通過移動,檢查兩個隱藏字段插入的OnPreRender方法的代碼,或添加下面的方法到我的代碼來解決我的問題 -
Private Sub Event_Handler(ByVal sender As Object, ByVal e As EventArgs)
Handles hdEventName.ValueChanged
' do stuff with hiddens
' ...
' reset the values back
hdEventName.Value = String.Empty
hdEventArgs.Value = String.Empty
End Sub
感謝您的答覆。是的,我明白將控件聲明爲字段實際上並不會在回發中存儲它們。但是在回發中不存儲控件。每次.NET頁面回發時,都會創建,加載和呈現每個.NET控件,因此唯一真實的內容是頁面獨一無二的,並在回傳中保留ViewState。我曾嘗試過您的解決方案以防萬一,但不幸的是,它產生了相同的結果。 – Sergei 2010-03-16 20:50:03