平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

ASP.NET WebFormsのとある出来事

あるコントロールにデータバインドする画面があるのだが、作り方が悪く、1リクエストで2回バインドしたりしている。アプリとしては、後からバインドしたデータで上書きしてほしいようだ。まあ無駄ではあるが、ASP.NETの標準コントロールなら期待通り動く。

ところが、そこでデータバインドしたいコントロールは、サードパーティ製のコントロールだったりして、そうすると期待通りに動かなかったりする。たとえば一旦データバインドすると、二回目以降のデータバインドが無視されたり。

コントロールのベンダーに問い合わせると、二回目のデータバインドの前に※※というメソッドを呼べとのこと。そうすると確かにデータが更新される。これで問題ない。

ところがやはり問題はあった。データバインドを二回呼ぶと、子のコントロールが二回分生成される(テンプレートが二回具現化される)のだ。※※メソッドのおかげで、古い方のコントロール群はレンダリングされないのだが、PreRenderメソッドまでは呼び出されている。しかも、古いコントロールと新しいコントロールでClientIdが同じになっていたりする。

さらに悪いことに、テンプレートフィールドで描画しようとしているコントロールは、PreRenderの中で、JavaScriptの拡張属性(ExpandoAttribute)を登録していた。

結果として何が起きたか。ClientIdがバッティングする新旧コントロールが、同じキーを使ってExpandoAttributeを登録するため、二回目の登録時に例外が発生する。

こういうのに当たるともう何もかも嫌になるぜ。