【问题标题】:Single f:viewParam fails validation on postback (ajax) requests on a ViewScoped bean单个 f:viewParam 无法对 ViewScoped bean 上的回发 (ajax) 请求进行验证
【发布时间】:2012-11-01 19:37:03
【问题描述】:

我将一个请求参数传递给在相应的preRenderView event/listener 中处理的 facelet 页面:

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="id" value="#{essayDetails.id}" />
        <f:event type="preRenderView" listener="#{essayDetails.init}"/>
    </f:metadata>
</ui:define>

Init 方法被正确访问,页面正常呈现。我有一个通过 ajax 请求显示模式面板的 commandLink(RichFaces 组件):

<a4j:commandLink rendered="#{essayDetails.comment}" render="create_comment_group" oncomplete="#{rich:component('create_comment_panel')}.show()">
    <h:graphicImage library="images/icons" name="comment.png" />
</a4j:commandLink>

模态面板sn-p:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:a4j="http://richfaces.org/a4j"
            xmlns:rich="http://richfaces.org/rich"
            xmlns:utils="http://java.sun.com/jsf/composite/components/utils">

<rich:popupPanel id="create_comment_panel" autosized="true">

    <f:facet name="header">
        <utils:labeledIcon label="#{msg.action_comment}" image="icons/comment.png" />
    </f:facet>

    <h:form>

        <h:panelGroup id="create_comment_group">

            <h:inputTextarea cols="80" rows="8" value="#{essayDetails.userComment}" style="resize: none;" />

            <table style="width: 100%">
                <tr>
                    <td style="width: 50%;text-align: right;">
                        <a4j:commandButton  value="#{msg.button_create}" action="#{essayDetails.saveComment}" execute="create_comment_panel_essay" render="essay_comments"  oncomplete="#{rich:component('create_comment_panel')}.hide()" />
                    </td>
                    <td style="width: 50%;text-align: left;">
                        <a4j:commandButton value="#{msg.button_cancel}" execute="@none" oncomplete="#{rich:component('create_comment_panel')}.hide()" />
                    </td>
                </tr>
            </table>

        </h:panelGroup>

    </h:form>

</rich:popupPanel>

在此面板中,注释被插入到 h:inputTextArea 字段中,但是当按下相应的接受按钮而不是调用 #{essayDetails.saveComment} 方法时,回发请求无法验证 f:viewParam id 参数,说明该字段需要一个值。

如果我们对原始代码不做任何更改,而是添加一个额外的f:viewParam

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="id" value="#{essayDetails.id}" required="true" />
        <f:viewParam name="v" value="#{essayDetails.v}" required="true" />
        <f:event type="preRenderView" listener="#{essayDetails.init}"/>
    </f:metadata>
</ui:define>

没有验证错误,行为符合预期。我在使用 f:viewParam 和/或 preRenderView 事件时做错了什么?

提前致谢!

【问题讨论】:

    标签: jsf-2 richfaces ajax4jsf


    【解决方案1】:

    试试这个:

    <f:viewParam name="id" value="#{essayDetails.id}" required="#{not facesContext.postback}" />
    

    【讨论】:

      【解决方案2】:

      尝试检查您的 init() 方法是否是回发:

      if (!FacesContext.getCurrentInstance().isPostback()) {
          //do your initilialization
      }
      

      【讨论】:

      • 检查正确但结果如上。唯一可行的方法是使用属性“required="false"”声明“f:viewParam”。如果元数据部分包含多个具有“required="true"' 属性的参数,则回发请求没有问题。
      猜你喜欢
      • 2015-01-14
      • 2012-05-18
      • 1970-01-01
      • 2011-07-29
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多