<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>
没有验证错误。如果我将 "conditionallyRnedered"
中的 rendered
属性的值从 "#{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
更改为某个 View id:
<update id="javax.faces.ViewState">-5902669082498843838:729675320168079573</update>
我仍然怀疑,这是解决方案还是解决方法,因为我认为当我们没有离开页面时, @ViewScoped
bean 的实例就存在。也许此行为是由于同一页面中存在另一个具有 @SessionScoped
作用域的 bean 引起的。
最佳答案
由于本问答中解释的技术原因而失败:Form submit in conditionally rendered component is not processed 。简而言之,JSF 将重新检查rendered
处理表单提交/转换/验证期间的属性并跳过在那一刻未呈现的组件。答案是使用@ViewScoped
bean 。
尽管您实际上使用的是@ViewScoped
,但它仍然失败bean 是因为您通过 <f:view transient="true">
使用无状态 View ,经实际确认javax.faces.ViewState
值和What is the usefulness of statelessness in JSF?换句话说,JSF 不会保存/恢复 View ,包括任何 View 作用域的 bean。从技术上讲,这些 bean 的行为类似于 @RequestScoped
beans,因此会在每次请求时重新创建,每次都将其属性重置为默认值。
要解决您的问题,只需通过删除关闭无状态 View <f:view transient="true">
并保留你的 bean @ViewScoped
.
关于ajax - primefaces 不验证 ajax 渲染的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33785199/