ASP.NET Webフォームでマスターページを使うと、レンダリング結果の HTML 中、各 Web サーバーコントロールの ID には必ず "ctl00_..." というプレフィクスが付く。
これは実はマスターページの ID だ。
Web サーバーコントロールの ID は、特にプログラマが設定しなければ、ASP.NET 側で ctl<連番> という形式で自動で ID を振るが、それだ。
どうにもウザいし、ちょっと巨大なページになると、この ID が占める割合もだんだん馬鹿にならなくなってくる。
例えば 100行 の GridView があって、内3列にWebサーバーコントロールを貼り付けたとすると、ctl00=5文字 x 100行 x 3列 = 1,500 バイト、となるわけだ。
まぁ、たかだか 1,500 バイトごとき、ギガビットの時代ではゴミみたいなものに思える。
しかし、JavaScript ファイルは無駄な空白や改行を除去して圧縮していることを考えると、そのせっかくの JavaScript ファイルの圧縮によって稼いだバイト数を、あっさりと消費してしまうという見方もある。
これについての特効薬は、今後リリース予定の ASP.NET 4 で導入される
Control.ClientIDMode プロパティだ(あるいは、既存のコードを全面的に書き直して良いのであれば、ASP.NET MVC へ乗り換えるという手段もあるが)。
しかし、ASP.NET 4 まで待てない場合でも、多少の緩和策はある。
マスターページの ID を明示的に指定するのだ。
マスターページのビハインドコード上で、マスターページクラスのコンストラクタ中で自身の ID を指定すればよい。
こんな感じ。
public partial class Site1 : System.Web.UI.MasterPage
{
public Site1()
{
this.ID = "_";
}
}
マスターページの ID をアンダーバー 1文字にしてしまうことで、レンダリングされた HTML が少しはすっきりするし、1サーバーコントロールに付き 5バイト消費していたプレフィクスが 1バイトにまで収まる。
なお、「this.ID = "";」とやった場合は、結局 ASP.NET によって "ctl00" が自動で振られてしまうのであしからず。
まぁ、こんなみみっちい話題に拘泥せず、ASP.NET 4 を待った方が素直でよいとは思うが。