ajax - primefaces 不验证 ajax 渲染的组件

标签 ajax jsf primefaces

<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>

返回验证错误。问题是:

  1. 为什么条件渲染组件未经过验证?
  2. 是否可以对其进行验证?

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/

相关文章:

jsf - 我们可以用 <p :calendar> 应用掩码操作吗

java - <p :messages> summary and detail 中的重复文本

jsf - 将元素 ID 与 JSF 动态 View ID 匹配

java - JSF : How to update one session bean base on another session bean?

java - JSF2.0(Primefaces)中带有filteroptions方法的SelectOneMenu

带有单选按钮的 PHP 邮件程序表单使用 AJAX 发送

jquery - FormData 发送文件+数据

php - 使用json更新mysql数据库空白字段

javascript - 使用 jQuery 进行 Ajax 分页

css - 更改 LightBox Primefaces 的样式边框