読者です 読者をやめる 読者になる 読者になる

月数など単純なDropdownChoiceを使うケース

Wicket DropDownChoice で型を Integer にしたシンプルなケースの注意すべきこと。

1~12の数のプルダウンを用意する場合、

<select wicket:id="month"></select>

List<Integer> monthlist = new ArrayList<Integer>();
for(int i=1;i <= 12;i++) monthlist.add(i);

DropDownChoice<Integer> month = new DropDownChoice<Integer>("month",new Model<Integer>(12), monthlist);

とすると、生成されるHTMLは、以下のようになってしまいます。

<select name="month">
<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
<option value="5">6</option>
<option value="6">7</option>
<option value="7">8</option>
<option value="8">9</option>
<option value="9">10</option>
<option value="10">11</option>
<option selected="selected" value="11">12</option>
</select>

DropDownChoice getModelObject() で想定の選択値、
上記の場合は、12 が取得ができるのですが
jQuery で、optionタグの value 属性を参照するような場合にこれは困ります。
IChoiceRenderer を使えばいいのですが、ちょっとコードが長くなります。

DropDownChoice<Integer> month = new DropDownChoice<Integer>("month",new Model<Integer>(12), monthlist
,new IChoiceRenderer<Integer>(){
   @Override
   public Object getDisplayValue(Integer i){ return i; }
   @Override
   public String getIdValue(Integer i,int index){ return i.toString(); }
}
);

これなら、optionタグは、きれいになります。

<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
     :