前回まで ASP.NET Web フォーム実装とMVC実装を同居させるエントリを書いてきたが、今回は一回休み。
今回は純粋に ASP.NET MVC2 の話。
次のようなビューを書いた。
<% for(var i=0; i<Model.Penguins.Length; i++){ %>
<div>
<%: Model.Penguins[i].Name %>
<%: Html.CheckBoxFor(m => m.Penguins[i].Favorite) %>
<%: Html.LabelFor(m => m.Penguins[i].Favorite) %>
</div>
<%} %>
ペンギンの種類の集合に対して、各ペンギンの種類の名前を表示。
その横に、そのペンギンが「お気に入り」かどうかを示すチェックボックスを配した。
概ねちゃんと動作するのだが、どういうわけか、チェックボックスに対するラベルである「Favorite」の箇所をどうクリックしても、チェックボックスが On/Off しないのである。
もちろん、チェックボックスそのものをクリックすれば、ちゃんと On/Off は切り替わる。

はき出された HTML ソースを確認してみると、
<input name="Penguins[1].Favorite" id="
Penguins_1__Favorite" type="checkbox" value="true"/>
<label for="
Penguins[1]_Favorite">Favorite</label>
おやおや。
label の for 属性値が、ラベル対象の input 要素の id 属性値に一致していませんね。
"." は "_" にエスケープされているけど、"[" と "]" はエスケープされていない模様。
ソースコードは確認していないが、同じエスケープ処理をしない理由がなにかあるのだろうか。
致し方ないので、ヘルパメソッドは使わずに、生のHTMLでゴリゴリ書いてしのいだ。
<% for(var i=0; i<Model.Penguins.Length; i++){ %>
<div>
<%: Model.Penguins[i].Name %>
<%: Html.CheckBoxFor(m => m.Penguins[i].Favorite) %>
<label for='<%: string.Format("Penguins_{0}__Favorite", i) %>'>Favorite</label>
</div>
<%} %>
うーん、フィードバックすべきかな?
それともこういう使い方が間違ってるとか?