我在代码中实现dropdownchoice时遇到问题。我想显示类型为ProductCategory的对象的列表。一切都很好,但是当我尝试保存表单时,将保存整个ProductCategory对象,而不仅仅是保存在选择列表中的对象字段。
这是我的代码:
IModel categories = new LoadableDetachableModel() {
public List<ProductCategory> load() {
List<ProductCategory> l = categoryService.findAllProducts();
return l;
}
};
IChoiceRenderer renderer = new IChoiceRenderer() {
public Object getDisplayValue(Object obj) {
ProductCategory category = (ProductCategory) obj;
return category.getName();
}
public String getIdValue(Object obj, int index) {
ProductCategory category = (ProductCategory) obj;
return category.getName();
}
};
DropDownChoice<ProductCategory> listCategories = new DropDownChoice<ProductCategory>(
"productCategory",
categories,
renderer
);
add(listCategories);
生成的HTML看起来像这样:
<select wicket:id="productCategory" name="productCategory">
<option selected="selected" value="">Vælg en</option>
<option value="test1">test1</option>
<option value="test2">test2</option>
</select>
“ productCategory”字段存在于“产品”类型的对象中,并且为字符串类型。
正如我试图描述的那样;我想将ProductCategory.getName()保存到Product中的“ productCategory”字段中,而不是整个ProductCategory对象中。
换句话说:我想将“ test1”保存到Product.productCategory,但是它将com.test.webapp.domain.ProductCategory@1保存。
谁能告诉我这是怎么做的?
任何帮助深表感谢。
最佳答案
您的问题是ddc后面的模型对象的类型为ProductCategory。保存时,它将强制转换为String类型-表单后面的模型对象中定义的类型。
我将代码更改为在选择列表中仅包含字符串。
public List<String> load() {
List<String> pcChoices = new ArrayList<String>();
for(ProductCategory pc : categoryService.findAllProducts()) {
pcChoices.add(pc.getName());
}
return pcChoices;
}
这样,您还可以摆脱选择的渲染器。