<h:form id="formEdit">
<p:selectOneMenu value="#{testView.selection}"
required="true">
<f:selectItem itemValue="noMenu" itemLabel="selectOneMenu not rendered"/>
<f:selectItem itemValue="haveMenu" itemLabel="selectOneMenu rendered"/>
<p:ajax update="formEdit"/>
</p:selectOneMenu>
<p:panel>
<p:selectOneMenu id="conditionallyRnedered" value="#{testView.value}"
rendered="#{testView.selection eq 'haveMenu'}"
required="true">
<f:selectItem itemValue="#{null}" itemLabel="-" noSelectionOption="true"/>
</p:selectOneMenu>
</p:panel>
<p:messages id="messages"/>
<p:commandButton value="Submit"/>
</h:form>
组件"conditionallyRnedered"
是必需的,并且在我在第一个菜单中选择"haveMenu"
值后在页面上呈现。此组件只有空选项,并且初始未在页面上呈现。如果按“提交”按钮,则响应为:
<partial-response><changes>
<update id="javax.faces.ViewState"><![CDATA[stateless]]></update>
</changes></partial-response>
没有验证错误。如果我将rendered
中"conditionallyRnedered"
属性的值从"#{testView.selection eq 'haveMenu'}"
更改为"true"
,则响应为:
<partial-response><changes>
<update id="javax.faces.ViewState"><![CDATA[stateless]]></update>
<extension ln="primefaces" type="args">{"validationFailed":true}</extension></changes>
</partial-response>
返回验证错误。问题是:
UPD
最初在我的问题中缺少Bean源代码,其中Bean声明为@ViewScoped
。阅读@BalusC comment后,我尝试将范围从@ViewScoped
更改为@SessionScoped
,然后验证工作正常。其中javax.faces.ViewState
的响应从stateless
更改为某个视图ID:
<update id="javax.faces.ViewState">-5902669082498843838:729675320168079573</update>
我仍然怀疑,这是解决方案或仍在解决方法,因为我认为@ViewScoped
bean的实例存在,而我们没有离开页面。也许这种行为是由于在同一页面中呈现另一个bean,@SessionScoped
范围。
答案 0 :(得分:3)
由于本Q&amp; A:Form submit in conditionally rendered component is not processed中解释的技术原因,它失败了。简而言之,JSF将在处理表单提交/转换/验证期间重新检查rendered
属性,并跳过在该时刻未呈现的组件。答案是使用@ViewScoped
bean。
尽管您实际使用的是@ViewScoped
bean,但它仍然失败的原因是您通过<f:view transient="true">
使用了无状态视图,正如实际javax.faces.ViewState
所确认的那样1}} value和What is the usefulness of statelessness in JSF?换句话说,JSF不会保存/恢复视图,包括任何视图范围的bean。这些bean在技术上会像@RequestScoped
bean一样运行,因此可以在每次请求时重新创建,每次都将其属性重置为默认值。
要解决您的问题,只需按删除 <f:view transient="true">
关闭无状态视图,然后保留您的bean @ViewScoped
。
答案 1 :(得分:-1)
@bobzer,
primefaces commandButton默认变为ajax =“true”。因此,当我设置ajax =“false”时,表单将被提交,我可以看到验证错误
我的xhtml:
<h:form id="formEdit">
<p:selectOneMenu value="#{testView.selection}" required="true">
<f:selectItem itemValue="noMenu"
itemLabel="selectOneMenu not rendered" />
<f:selectItem itemValue="haveMenu" itemLabel="selectOneMenu rendered" />
<p:ajax update="formEdit" />
</p:selectOneMenu>
<p:panel>
<p:selectOneMenu id="conditionallyRnedered" value="#{testView.value}"
rendered="#{testView.selection eq 'haveMenu'}" required="true">
<f:selectItem itemValue="#{null}" itemLabel="-"
noSelectionOption="true" />
</p:selectOneMenu>
</p:panel>
<p:messages id="messages" />
<p:commandButton value="Submit" ajax="false"/>
</h:form>
我的豆子
package citi.manageID.framework.admin.roleMgmt;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class TestView {
private String selection="";
private String value="";
public String getSelection() {
return selection;
}
public void setSelection(String selection) {
this.selection = selection;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}