Before Visual Studio 2010, I've not liked fiddling with client side IDs in ASP.NET, especially when web page element is nested in another element. For example, this markup that is part of a user web control sets ClientID to 'CustomerChoice'.
<asp:DropDownList ID="ddlCustomers" ClientID="CustomerChoice" runat="server">
<asp:ListItem>Jason</asp:ListItem>
<asp:ListItem>Jack</asp:ListItem>
</asp:DropDownList>
If the user web control is hosted on an .aspx page, id becomes 'wucCustomers1_ddlCustomers' when rendered in a browser. The user control's ID is added as a suffix to the DropDownList's ID to become the ID.
<select name="wucCustomers1$ddlCustomers" id="wucCustomers1_ddlCustomers">
<option value="Jason">Jason</option>
<option value="Jack">Jack</option>
</select>
If a JavaScript script is created that uses that id and then the control is moved to say - a content area, the id changes and the script breaks.
Visual Studio 2010 introduces the ClientIDMode attribute to solve that problem.
<asp:DropDownList ID="ddlCustomers" ClientID="CustomerChoice" ClientIDMode="Static" runat="server">
<asp:ListItem>Jason</asp:ListItem>
<asp:ListItem>Jack</asp:ListItem>
</asp:DropDownList>
Look at how the client side ID renders in the browser now:
<select name="wucCustomers1$ddlCustomers" id="CustomerChoice">
<option value="Jason">Jason</option>
<option value="Jack">Jack</option>
</select>