我想出了一个奇怪的问题。我试图隔离问题所以以下是我的简化代码。
public class MyBean {
private List<Data> dataList;
Data selectedData;
public MyBean() {
dataList = new ArrayList<Data>();
dataList.add(new Data("John", 16));
dataList.add(new Data("William", 25));
}
public List<Data> getDataList() {
return dataList;
}
public void edit(Data data) {
selectedData = data;
}
public void newData() {
selectedData = new Data(null, null);
}
public Data getSelectedData() {
return selectedData;
}
public class Data {
String name;
Integer age;
Data(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
}
XHTML:
<rich:modalPanel id="pop">
<h:form>
Name: <h:inputText value="#{myBean.selectedData.name}" required="true" id="txtName"/><br/>
Age : <h:inputText value="#{myBean.selectedData.age}" required="true" id="txtAge"/>
<a4j:commandButton value="Save"/>
<a4j:commandButton value="Close" onclick="Richfaces.hideModalPanel('pop');return false;"/>
<br/>
<rich:message for="txtName"/><br/>
<rich:message for="txtAge"/>
</h:form>
</rich:modalPanel>
<h:form>
<rich:dataTable value="#{myBean.dataList}" var="data">
<rich:column>#{data.name}</rich:column>
<rich:column>
<a4j:commandLink value="Edit" action="#{myBean.edit(data)}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</rich:column>
</rich:dataTable>
<a4j:commandButton value="New" action="#{myBean.newData()}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</h:form>
这是错误的路径:
只有在弹出窗口中验证失败时才会发生这种情况 有解决方案吗?
答案 0 :(得分:31)
JSF 2中的这个问题也在以下答案中得到了认可和解释:How can I populate a text field using PrimeFaces AJAX after validation errors occur?如果您使用的是JSF 2,那么您可以使用OmniFaces'ResetInputAjaxActionListener
或PrimeFaces'{{3}为此。
到目前为止,您需要清除<p:resetInput>
or resetValues="true"
组件的状态,当它即将呈现ajax时,但不包含在ajax-execute中。要清除状态,在JSF 2中你可以使用方便方法EditableValueHolder
,但这在JSF 1.2中不可用,你需要调用4个单独的方法setValue(null)
,{{1 }},setSubmittedValue(null)
,setLocalValueSet(false)
来清除状态。
要确定哪些组件是ajax呈现的,但不是ajax执行的,在JSF 2中你会使用setValid(true)
方法,但这在JSF 1.2中不可用还没有标准化ajax。你需要摆弄RichFaces特定的ajax API才能算出来。我不能从头顶说出来,所以这是一个启动示例,假设您已经知道需要清除的组件。想象一下,弹出窗口中的表单为PartialViewContext
,名称输入字段为id="popForm"
,以下是您在id="nameInput"
方法中清除它的方法:
newData()
答案 1 :(得分:1)
在取消操作上做一件事将所有弹出值设置为null。现在在您下一次单击所有设置为默认值的值。
或单击将所有先前值设置为null。并在此之后设置所有相应的值。
答案 2 :(得分:1)
我遇到了同样的问题。如果您使用的是Primefaces,解决方案就像将resetValues="true"
放在p:commandLink或p:commandButton上来加载所选项目一样简单。
答案 3 :(得分:-2)
验证失败后,如果您希望与作为提交参数传递的输入数据保持相同,则将 value属性设置为表单bean名称,如下所述:
<input type="text" id="fname" path="fname" value="${myFormBean.fname}"/>