R – Why is ViewState lost when a control’s property is modified during its parent’s Control.Render method

asp.netasp.net-2.0viewstatewebforms

I have code like the following in a UserControl:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    If someCondition Then
        childControl.Enabled = false
    End If

    MyBase.Render(writer)
End Sub

Whenever someCondition is true and childControl.Enabled is set to false during the Render event, the ViewState for childControl is destroyed (i.e. if it is a TextBox, the text that the user has entered is lost).

Note that only the ViewState is lost… The control still renders with the correct property values the first time around. Only on PostBack, when properties are restored from ViewState are the values actually lost.

The timeline is as follows:

  • Page_Load (initial)
    Properties are set via code.
  • SaveViewState
  • Render
    Properties are modified.
  • Postback occurs.
  • LoadViewState
  • Page_Load
    Values of unaltered controls are still available, but controls which have had properties set during the Render method are blank.
  • SaveViewState

My understanding was that the ViewState became fixed during the call to Control.SaveViewState, which occurs prior to the call to Control.Render… But is there some nuance that I'm missing?

Best Answer

Do controls that are disabled post empty values? Or post nothing at all? To be honest, I forget. But if they post empty values, then your viewstate is being overridden just like if you typed something new into the textbox and then posted the page.

Related Topic