0

我有一个包含 inputText 和消息组件的表单。
我想从支持 bean 设置错误消息,但一直失败。

下面是我的html代码:

<h:form id="formId">
    <h:panelGrid id="repeater" columns="2">
        <h:outputText value="#{msg['label.appeal.case.reference.no']}" />

        <ui:repeat id="uirepeater" value="#{beanPage.list}" var="value" varStatus="status">
            <h:panelGrid columns="2">
                <p:inputText id="refNo" value="#{beanPage.list[status.index]}" />
                <p:message for="refNo" display="text" />                
            </h:panelGrid>
        </ui:repeat>
    </h:panelGrid>

    <p:commandButton id="btmAdd" actionListener="#{beanPage.addRow}" value="Add" update="@form" />
    <p:commandButton id="btmSubmit" actionListener="#{beanPage.submit}" value="Submit" update="@form" />
</h:form>

以下是支持 bean 代码:

public void submit() {
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "test", "test");
    FacesContext.getCurrentInstance().addMessage(":formId:uirepeater:refNo", msg);
    FacesContext.getCurrentInstance().addMessage(":formId:uirepeater:0:refNo", msg);
}
4

2 回答 2

0

这不适用于 ui:repeat。inputText 的实际 ID 不会像您想象的那样是“refNo”。

< ui:repeat > 将通过在生成组件的客户端 ID 前添加行索引来确保其唯一性。它只是多次渲染同一个组件,而不是在树中创建新组件。

您可能需要使用 c:forEach,它会在树中生成多个组件。

有关更多信息,请参阅:

https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat

如何在 ui:repeat 中设置组件/标签的 id

于 2014-02-24T13:39:55.020 回答
0

试试这个,我使用 primefaces 4.0、ViewScope、Ajax 请求。使用 p:component 获取 p:messages 属性 for="someComponent" 的 ClientId 并通过 p:remoteCommand 将此值传递给 bean,稍后您可以使用 ClientId 设置来自 bean 的消息。在某些元素中添加这个

    onclick="rc([{name:'index',value:#{item.index}},{name:'msg1',value:'#{p:component('someComponent')}'}])"

创建 p:remoteCommand 设置id

<p:remoteCommand process="@this" name="rc" action="#{bean.someMethod}"/>    

public void someMethod(){
FacesContext context = FacesContext.getCurrentInstance();
            Map<String,String> params = context.getExternalContext().getRequestParameterMap();
            int index=Integer.parseInt(params.get("index"));
            this.msg[index]=params.get("msg1");
}

现在您可以设置来自 bean 的消息:

FacesContext.getCurrentInstance().addMessage(this.msg[x], new FacesMessage(FacesMessage.SEVERITY_ERROR,null,"someMessage"));
于 2015-07-30T14:21:58.723 回答