我在使用immediate="true" (JSF 1.2)时遇到了一点麻烦。我的表单是关于车祸的:用户填写一些公共信息,然后他可以添加尽可能多的受影响的项目(树、栅栏、其他汽车等)
支持beanprivate String location;
private List<T> items;
private HtmlDataTable itemsUI;
public void remove(ActionEvent e) {
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
items.remove(Integer.parseInt(id));
}
public void add(ActionEvent e) throws InstantiationException, IllegalAccessException {
items.add(element.newInstance());
}
JSPX
<h:inputText
required="true"
value="#{ACC01.location}"/>
<h:dataTable
binding="#{ACC01.itemsUI }"
value="#{ACC01.items}"
var="item">
<h:column>
<h:selectOneMenu
value="#{item.id}>
<f:selectItems
value="#{ACC01.possibleElements}" />
</h:selectOneMenu>
<h:commandLink
actionListener="#{ACC01.remove }"
value="Remove" >
<f:param
name="id"
value="#{ACC01.itemsUI.rowIndex }"/>
</h:commandLink>
</h:column>
</h:dataTable>
<h:commandLink
actionListener="#{ACC01.add}"
value="Add" />
如果我为dataTable中受影响的元素设置immediate="true",当用户添加一个新元素时,其他元素返回到它们的默认值(例如,如果你有{'tree', 'car', 'fence'}它们变成{'default', 'default', 'default', new element})
如果我不使用immediate,受影响的元素保持正确的值,但用户必须在添加或删除受影响的元素之前填写'location'字段。
我想要的是能够保持受影响元素的值,并允许用户添加或删除它们,而不必首先填充'location'字段。
解决方案
在阅读了许多关于这个主题的文章之后,似乎唯一的方法就是避免自动验证,而在用户提交表单时手动验证。
检查必填字段是否为空,并以编程方式将错误消息附加到facescontext中。我真的不想那样做,因为我觉得那样很难看。
你能建议更好的方法来实现我需要的行为吗?
Thanks in advance
我目前工作的一位前开发人员提出了以下解决方案
JSPX
<h:inputText required="#{ACC01.saving}" value="#{ACC01.location}"/>
支持Bean private UICommand btn;
public boolean isSaving()
{
Map<?,?> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
return (params.containsKey(btn.getClientId(ctx)));
}
在您的情况下可能不完全正确,但基本上他创建了从屏幕上的按钮到后台bean中的'btn'变量的绑定。然后,当单击btn时,inputText将只看到所需的位置文本。在你的例子中,它是一个命令链接,所以它可能有点不同,但我认为它可能会有所帮助。