【问题标题】:Browser clientID is not accepted for FacesMessageFacesMessage 不接受浏览器客户端 ID
【发布时间】:2014-08-07 13:52:39
【问题描述】:

我有几个 <p:messages> 元素应该处理由单个 bean 产生的不同类型的错误。现在,我从浏览器获取的一个元素的 clientID 始终相同,因为内部没有生成的 id(总共 3 个 ID)。

无论我将哪个 clientID 传递给 FacesContext.addMessage(),我最终都会在 每个 <p:messages> 元素上显示所有错误消息。

浏览器中的一个客户端ID:regelDetailAccordion:duoDlgForm2:regelDetail
浏览器中的另一个客户端 ID:regelDetailAccordion:duoDlgForm1:messagesNeuerFehler
豆码:FacesContext.getCurrentInstance().addMessage(X, new FacesMessage(...));
其中X 是clientID(不是)前面有: 和/或只有regelDetail,前面有和没有:。都试过了:(

对话框-包含:

<ui:insert name="insertDuo"><ui:include src="/includes/duoRegelStmt.xhtml" />
</ui:insert>

显示我所有messages的对话框:

    <p:dialog widgetVar="newDuoDialog" id="newDuoDlg" modal="true">
        <p:layout id="layout">
            <p:layoutUnit position="west">
                <ui:insert name="insertDetailStmt">
                    <h:form id="stmtDetailForm">
                        <ui:include src="/includes/stmtDetail.xhtml" /> <!-- left side -->
                    </h:form>
                </ui:insert>
            </p:layoutUnit>

            <p:layoutUnit position="center">
                <ui:insert name="insertDetailRegel">
                    <ui:include src="/includes/regelDetail.xhtml"/> <!-- right side -->
                </ui:insert>
            </p:layoutUnit>
        </p:layout>
    </p:dialog>

显示我的 3 个中的 2 个的对话框的右侧 messages

<ui:composition>
    <h:panelGrid id="unterheaderUndAccordion">
        <h:panelGrid rendered="#{...}" id="regelUnterheader"/>
        <p:accordionPanel multiple="true" activeIndex="0,1" id="regelDetailAccordion" rendered="#{...}">
            <p:tab>
                <h:form id="duoDlgForm1">
                    <ui:insert name="neuerFehler">
                        <ui:include src="/includes/neuerFehler.xhtml" />
                    </ui:insert>

                    <h:selectOneMenu value="#{regelBean.selectedFehlerCode}" id="selFCode"
                        onChange="submit()" process="@this" valueChangeListener="#{regelBean.changeFehlerCode}">
                        <p:ajax event="change" update="duoDlgForm1" />
                        <f:selectItems ... />
                    </h:selectOneMenu>
                </h:form>
            </p:tab>
            <p:tab>
                <h:form id="duoDlgForm2">
                    <h:panelGrid>
                        <p:messages id="regelDetail" showDetail="true" closable="true"/>
                    </h:panelGrid>
                </h:form>
            </p:tab>
        </p:accordionPanel>
    </h:panelGrid>
</ui:composition>

neuerFehler 包含一个定义如下的messages

<p:messages id="messagesNeuerFehler" showDetail="true" closable="true"/>

在我看来,当我为X 输入正确的值时,即使更新了其他messages,也只有正确的消息字段才会显示消息。如果这是真的,我必须输入的正确客户端 ID 是什么?提前非常感谢,我无能为力:(

【问题讨论】:

    标签: java jsf primefaces


    【解决方案1】:

    如果我正确理解问题,您可能会阻止使用 Primefaces 选择器更新某些组件,如下所示:

    <h:form>
        <h:inputText ... />
        <h:inputText ... />
        <h:inputText ... styleClass="noupdate" />
        <h:inputText ... />
        <h:inputText ... />
        <p:commandButton ... update="@(form :not(.noupdate))"/>
    </h:form>
    

    BalusC here的原始答案。

    如果这没有帮助,您可以在消息组件上使用 for 属性吗?在我看来,您希望 FacesMessage 中的 clientid 是消息组件的标识符,而它是有错误的组件的标识符。如果我误会了,请见谅。

    【讨论】:

      【解决方案2】:

      尝试使用

      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Your message"));
      

      并向组件添加update="elementId" 属性,这会触发您的托管bean 操作。

      “elementId”当然是你的&lt;p:messages&gt;元素对应的id。

      对我来说,这种方式效果很好。也许它也能解决你的问题。

      【讨论】:

      • 但是如果我的更新按钮已经更新了一个更大的范围,其中包含多个 messages 呢?
      • 那会是个问题,因为你的更新组件里面的所有组件都会被更新。您可以尝试只更新需要的。可能很多,但您可以在更新属性中用空格分隔它们。我不知道这是否对你有用。你也可以提供带有按钮的代码吗?
      • 我理解你的意思,但我有点怀疑这是要走的路,尽管它可能会奏效。我的意思是,显然X 不应该是null
      • 我没有说这是确定的方法。我只是告诉你它在 PrimeFaces 文档中是如何描述的以及我处理这个问题的方式。
      • 我知道你没这么说 ;) 你在说文档的哪一部分?
      猜你喜欢
      • 2011-07-28
      • 2011-04-21
      • 1970-01-01
      • 2021-04-23
      • 2015-06-13
      • 1970-01-01
      • 2019-06-13
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多