あるコントロールにデータバインドする画面があるのだが、作り方が悪く、1リクエストで2回バインドしたりしている。アプリとしては、後からバインドしたデータで上書きしてほしいようだ。まあ無駄ではあるが、ASP.NETの標準コントロールなら期待通り動く。
ところが、そこでデータバインドしたいコントロールは、サードパーティ製のコントロールだったりして、そうすると期待通りに動かなかったりする。たとえば一旦データバインドすると、二回目以降のデータバインドが無視されたり。
コントロールのベンダーに問い合わせると、二回目のデータバインドの前に※※というメソッドを呼べとのこと。そうすると確かにデータが更新される。これで問題ない。
ところがやはり問題はあった。データバインドを二回呼ぶと、子のコントロールが二回分生成される(テンプレートが二回具現化される)のだ。※※メソッドのおかげで、古い方のコントロール群はレンダリングされないのだが、PreRenderメソッドまでは呼び出されている。しかも、古いコントロールと新しいコントロールでClientIdが同じになっていたりする。
さらに悪いことに、テンプレートフィールドで描画しようとしているコントロールは、PreRenderの中で、JavaScriptの拡張属性(ExpandoAttribute)を登録していた。
結果として何が起きたか。ClientIdがバッティングする新旧コントロールが、同じキーを使ってExpandoAttributeを登録するため、二回目の登録時に例外が発生する。
こういうのに当たるともう何もかも嫌になるぜ。