我有一个简单的表单,它由一个使用ListView的表单中的可变数量的元素组成。每个元素都在一个表行中,并包含一个名称(链接可以正常工作)和一个CheckBox,它标记该行以进行删除。只有复选框可在表单中编辑。表单底部是“删除已选中”按钮,该按钮将用于删除所有选中支票的条目。
我尝试使用RepeatingView和ListView执行此操作,并且两者都有相同的问题 - 在提交表单时,复选框的内部模型状态不会更新 - 它们始终为false。在SearchWrapper类setSelected方法中,永远不会显示记录器输出(其他记录是因为它不是记录问题)
有人能看出为什么这是错的吗?
public class SavedSearchesTab extends Panel
{
private static final Logger LOGGER = ...
/**
*
*/
public SavedSearchesTab( String p_id )
{
super( p_id );
Form<?> l_form = new Form<Object>( "savedsearchform" ) {
/**
* @see org.apache.wicket.markup.html.form.Form#onSubmit()
*/
protected void onSubmit()
{
LOGGER.info( "Form Submitted!" );
for( String l_paramName : getRequest().getRequestParameters().getParameterNames() ) {
LOGGER.info( "FormParam: " + l_paramName + ", value=" + getRequest().getRequestParameters().getParameterValue( l_paramName ) );
}
onDeleteSelected();
}
};
l_form.setOutputMarkupId( true );
add( l_form );
List<UserSavedSearch> l_searches = getSearches();
ListView<UserSavedSearch> l_repeater = new ListView<UserSavedSearch>( "repeater", l_searches ) {
protected void populateItem( final ListItem<UserSavedSearch> p_item )
{
final UserSavedSearch l_search = p_item.getModelObject();
SearchWrapper l_wrapper = new SearchWrapper( l_search );
AjaxLink<UserSavedSearch> l_link = new AjaxLink<UserSavedSearch>( "searchnamelink" ) {
private static final long serialVersionUID = 1L;
public void onClick( AjaxRequestTarget p_target )
{
selectSearch( l_search );
}
};
String l_linkText = l_search.getName();
Label l_linkLabel = new Label( "searchnamelabel", l_linkText );
l_link.add( l_linkLabel );
p_item.add( l_link );
TextArea<String> l_descriptionArea = new TextArea<String>( "searchsummary", new Model<String>( toSummary( l_search ) ) );
p_item.add( l_descriptionArea );
CheckBox l_checkbox = new CheckBox("searchcheckbox", new PropertyModel<Boolean>( l_wrapper, "selected" ) );
p_item.add( l_checkbox );
}
};
l_repeater.setReuseItems( true );
l_form.add(l_repeater);
}
private List<UserSavedSearch> getSearches() {
List<UserSavedSearch> l_searches = new ArrayList<UserSavedSearch>();
// Make a couple of example ones for testing
UserSavedSearch l_eg = new UserSavedSearch();
l_eg.setName( "Example Search 1" );
l_eg.setSearchArea( SearchArea.CUSTOMERS );
l_searches.add( l_eg );
l_eg = new UserSavedSearch();
l_eg.setName( "Example Search 2" );
l_eg.setSearchArea( SearchArea.CUSTOMERS );
l_searches.add( l_eg );
return l_searches;
}
private String toSummary( UserSavedSearch p_search ) {
return "Summary of " + p_search.getName(); // TODO
}
protected void onDeleteSelected() {
}
protected void selectSearch( UserSavedSearch p_search ) {
LOGGER.info( "Search " + p_search.getName() + " should be displayed!" );
}
private class SearchWrapper implements Serializable {
private static final long serialVersionUID = 1L;
private UserSavedSearch m_data;
private Boolean m_toDelete;
public SearchWrapper( UserSavedSearch p_data ) {
m_data = p_data;
m_toDelete = false;
}
public boolean isSelected() {
return m_toDelete;
}
public void setSelected( boolean p_selected ) {
LOGGER.info( "SETTING SEARCHWRAPPER SELECTED STATE: " + p_selected );
m_toDelete = p_selected;
}
public UserSavedSearch getSearch() {
return m_data;
}
}
HTML:
<wicket:panel>
<span class="sectiontitle"><wicket:message key="sectiontitle">savedsearches</wicket:message></span>
<form wicket:id="savedsearchform">
<fieldset>
<table id="savedsearchtable">
<tbody wicket:id="repeater">
<tr>
<td><input wicket:id="searchcheckbox" type="checkbox" name="searchselect" wicket:message="value:fragment.select.search" /></td>
<td><a href="#" wicket:id="searchnamelink"><span wicket:id="searchnamelabel">searchname</span></a></td>
</tr>
<tr>
<td colspan="2"><textarea wicket:id="searchsummary" readonly="readonly" rows="3" cols="100"/></td>
</tr>
</tbody>
<tr class="buttonPanel">
<td colspan="2">
<input type="submit" wicket:message="value:button.deleteselectedsearches"/>
</td>
</tr>
</table>
</fieldset>
</form>
</wicket:panel>
提前致谢。
答案 0 :(得分:0)
问题是当您填充复选框时,您没有定义清晰的模型对象。应该以onSubmit方法中的方式初始化此模型。
我建议在SavedSearchesTab构造函数中实例化您的模型对象,确保该变量是最终的,将其添加到表单中并确保在所有图层中使用它。
关于你尝试恢复变量的方式,它不会那样工作,不是Wicket应该如何工作,如果你从我建议的地方实例化你的模型对象,你可以在onSubmit上访问该变量方法,它将具有表单中的属性,您不必关心将表单值映射到您的POJO,Wicket使用模型为您执行此操作。