Let’s say I want the user to select their favorite theme for my application. I can make a list of available themes in a DropDownList control.
I know I must set the Theme property before or during the page’s PreInit event.
What’s wrong with the following code?
The above code throws a null reference exception. PreInit fires before the page instantiates its controls, so _themeList is null (Nothing). I can’t use the _themeList control, but I can go directly to the Request.Form collection. The DropDownList (an HTML select) will post its new value into the form collection.
What could go wrong with this code?
Hint: this code will work for many webforms, but not if you are using a master page.
The problem with asking for “_themeList” is that “_themeList” is a server side ID. The browser will submit the form with a unique client side ID. If the DropDownList ends up inside an INamingContainer, the UniqueID property is not the same as the ID property (see my FindControl article for more on INamingContainer). If the DropDownList is on a master page, the UniqueID might look like “ctl00$_themeList”. If the DropDownList is inside a ContentPlaceHolder control, the UniqueID might look like "ctl00$ContentPlaceHolder1$_themeList" .
There are many ways to solve the problem. One solution might be a brute force search of the form collection for a key ending with “_themeList”. Another approach is to stash the list's UniqueID into a hidden form field.
I’m sure you can think of some other elegant ways to solve the problem. The trick, as always, is finding out what the problem really is.