views:

175

answers:

2

I have a custom control that inherits from .NET's CompositeControl class. This control overrides the CreateChildControls in order to build its child controls dynamically. I need the page to post back after a couple different javascript events occur on the client side.

In order to accomplish this, I create two hidden controls on the page so I can set their values with javascript, submit the page, and read the values out on server side. Here's is the code I use to create these two 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

When a javascript event occurs I set the value attribute of the two hiddens and submit the page, like so:

hdEventName.value = 'EventName';
hdEventArgs.value = 'arg1,arg2';
document.forms[0].submit();

In the OnLoad method of my control, I attempt to check the Value property of the hdEventName and hdEventArgs controls, but it is always empty. However, Page.Request.Form(hdEventName.UniqueID) and Page.Request.Form(hdEventArgs.UniqueID) return correct values. The actual HTML in the markup also shows correct values after the page posts back.

Why is the Value property of the HtmlInputHiddens disconnected from the actual value that appears on the client?

Update It appears that a control's properties get loaded from the form sometime after OnLoad occurs. Thus I was able to solve my problem by either moving the code that checks the two hidden fields into the OnPreRender method, or adding the following method to my code -

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
A: 

when the page posts back there's nothing to link the variable hdEventName to the control you previously created. what you're doing is akin to having an integer declared at the class level and setting it to 5 when you're creating child controls. there's nothing to maintain that value in that variable across postbacks.

if you want to get a reference to the control you created previously, you'd have to use

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

(i'm guessing at this) or Request if you're only concerned with the value.

lincolnk
Thanks for your response. Yes, I understand that declaring the controls as fields does not actually store them across postbacks. But no control is stored across postbacks. Every .NET control is created, loaded, and rendered every time the page posts back, and thus the only real thing that is unique to the page and persists across the postback is the ViewState. I did try your solution just in case, but unfortunately it yielded the same results.
A: 

It appears that a control's properties get loaded from the form sometime after OnLoad occurs. Thus I was able to solve my problem by either moving the code that checks the two hidden fields into the OnPreRender method, or adding the following method to my code -

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