2007-02-08

Fippla inte med ClientID för tidigt

ClientId propertyn på en kontroll har ett korrekt värde först efter det att kontrollen har lagts till en Controls-samling, dvs. först när den har fått en förälder. Inte nog med det, föräldern måste också ha en förälder och så vidare hela vägen upp till Page.

Om du anropar ClientId för tidigt, så får du tillbaka nåt oanvändbart. Inte nog med det, den gode kontrollen cachear dessutom värdet som den skickade till dig och alla efterföljande anrop kommer att få samma meningslösa värde. Detta drabbar inte bara dig utan även asp.net-motorn kommer att få fel värde. T.ex. så kommer postback-event att funger som de ska.

Big No-no:

public class MyControl : CompositeControl
{
protected override void CreateChildControls()
{
Button myButton = new Button();
myButton.Text = "Unclicked";
myButton.Click += new EventHandler(myButton_Click);
Controls.Add(myButton);

//MyControl has no parent yet. The following code will prevent
//the myButton_Click from beeing called when the button is clicked.
//Remove the line and it will be called.
string id = myButton.ClientID;
}

void myButton_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
button.Text = "clicked";
}
}


Ytterligare exempel: http://aspadvice.com/blogs/joteke/archive/2007/01/28/Accessing-ClientID-or-UniqueID-too-early-can-cause-issues.aspx