2010-03-16 48 views
1

我有一個從.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 

回答

0

看來,控件的屬性也會從形式加載的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 
0

當頁面回沒有什麼鏈接變量hdEventName添加到您之前創建的控件中。你在做什麼類似於在類級別聲明一個整數,並在創建子控件時將其設置爲5。沒有什麼可以在回發期間保持該變量的價值。

,如果你想獲得先前創建的控件的引用,你不得不如果你只關注價值使用

hdEventName = CType(Page.FindControl("hdEventName") , HiddenField) 

(我在此猜測)或請求。

+0

感謝您的答覆。是的,我明白將控件聲明爲字段實際上並不會在回發中存儲它們。但是在回發中不存儲控件。每次.NET頁面回發時,都會創建,加載和呈現每個.NET控件,因此唯一真實的內容是頁面獨一無二的,並在回傳中保留ViewState。我曾嘗試過您的解決方案以防萬一,但不幸的是,它產生了相同的結果。 – Sergei 2010-03-16 20:50:03