微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jsf-2 – 单个f:viewParam对ViewScoped bean上的回发(ajax)请求的验证失败

我将一个请求参数传递给facelet页面,该页面在相应的preRenderView事件/侦听器中处理:

<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方法并正常呈现页面.我有一个commandLink(RichFaces组件),通过ajax请求显示模式面板:

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

模态面板片段:

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

在此面板中,注释插入ah:inputTextArea字段,但是当按下相应的Accept按钮而不是调用#{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事件时我做错了什么?

提前致谢!

解决方法

试试这个:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐