primefaces不验证ajax渲染组件

时间:2015-11-18 16:23:18

标签: 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>

没有验证错误。如果我将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>

返回验证错误。问题是:

  1. 为什么有条件渲染的组件未经过验证?
  2. 可以对它们进行验证吗?
  3. 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范围。

2 个答案:

答案 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”时,表单将被提交,我可以看到验证错误

我得到validation error coming

我的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;
        }


    }