新米エンジニアの失敗再発防止メモ

自分そしてこの世界の皆が、同じ失敗をしないためのメモ

Twitterやってます!@rakuton_t
欲しいものリストのブタメンを送ってくれた方、ありがとうございます!

RadioButtonListまたはCheckBoxListのDataSourceにListItemをセットするとValueにTextの値が入ってしまうことの解決方法

こちらの方も悩んでいましたね。
解決方法が分かったので共有します。
d.hatena.ne.jp

直面している問題

以下のようにすると、ValueにTextの値が入ってしまいます。

<asp:RadioButtonList DataSource="<%# GetItemList() %>" ID="RadioButtonList" runat="server" />
<asp:CheckBoxList DataSource="<%# GetItemList() %>" ID="CheckBoxList" runat="server" />

DataSourceの定義。このListItemの第二引数の値は無視されてしまいます。

protected ListItemCollection GetItemList()
{
	var items = new ListItemCollection();
	items.Add(new ListItem("要素1", "1"));
	items.Add(new ListItem("要素2", "2"));
	return items;
}

出力結果(見るべき箇所だけ切り抜いてます)

<input id="RadioButtonList_0" type="radio" name="RadioButtonList" value="要素1"><label for="RadioButtonList_0">要素1</label>
<input id="RadioButtonList_1" type="radio" name="RadioButtonList" value="要素2"><label for="RadioButtonList_1">要素2</label>
<input id="CheckBoxList_0" type="checkbox" name="CheckBoxList$0" value="要素1"><label for="CheckBoxList_0">要素1</label>
<input id="CheckBoxList_1" type="checkbox" name="CheckBoxList$1" value="要素2"><label for="CheckBoxList_1">要素2</label>

valueと表示部どちらにもListItemの第一引数の値が入ってしまっていますね。
期待するのは、valueにはListItemの第二引数の1とか2が入ることですね。

解決方法

DataTextField属性とDataValueField属性を明示的に指定するとvalueの値はちゃんとvalueに入ります。

<asp:RadioButtonList DataTextField="Text" DataValueField="Value" DataSource="<%# GetItemList() %>" ID="RadioButtonList" runat="server" />
<asp:CheckBoxList DataTextField="Text" DataValueField="Value" DataSource="<%# GetItemList() %>" ID="CheckBoxList" runat="server" />

出力結果

<input id="RadioButtonList_0" type="radio" name="RadioButtonList" value="1"><label for="RadioButtonList_0">要素1</label>
<input id="RadioButtonList_1" type="radio" name="RadioButtonList" value="2"><label for="RadioButtonList_1">要素2</label>
<input id="CheckBoxList_0" type="checkbox" name="CheckBoxList$0" value="1"><label for="CheckBoxList_0">要素1</label>
<input id="CheckBoxList_1" type="checkbox" name="CheckBoxList$1" value="2"><label for="CheckBoxList_1">要素2</label>

今度はちゃんとvalueにListItemの第二引数が入っていますね。

ListItemの第一引数はText
第二引数はValue
という扱いですが、RadioButtonListとCheckBoxListが勝手に認識してくれるわけではないということですね。

私の記事が役に立ったら、どうぞ何か買ってください!→ Amazon欲しいものリスト