即使存在验证错误,JSF命令按钮也会更新

时间:2014-04-25 08:07:40

标签: jsf-2 primefaces

我是JSF的新手,我的问题对你来说可能很愚蠢..这对我来说非常有价值。

<h:form id="form1">
    <p:messages autoUpdate="true" showDetails="true" />
    <p:dataTable id='form1ID'>....</dataTable>
        <p:inputText value="#{bean.name}" required="true"
            requiredMessage="Please Enter Name!" label="Name ">
        </p:inputText>
</h:form>

<h:form id="form2">
    <p:messages autoUpdate="true" showDetails="true" />
    <p:dataTable id='form2ID'>....</dataTable>
        <p:inputText value="#{bean.name}" required="true"
            requiredMessage="Please Enter Name!" label="Name ">
        </p:inputText>
        <p:commandButton value="Submit" update=":form1:form1ID"
            actionListener="#{mgmtBean.doCreateType}" />
</h:form>

我有两种形式。当我点击带有空字段的form2命令按钮时,它会完全显示错误消息,因为我添加了<p:messages autoUpdate="true" showDetail="true"/>

这里的坏事或令人惊讶的事情是,它在form1之上显示错误消息也可能是因为在form1中添加了<p:messages autoUpdate="true" showDetail="true"/>而我试图在命令按钮上更新form1在form2。 当form2抛出验证错误消息时,我不想在form1上显示错误消息。我怎样才能解决这个问题 ?我用Google搜索了一下......但无法找到解决方案。

使用的环境是jsf-api-2.1.5和primefaces 4.0版本和视图技术是facelets(XHTML)
 希望很清楚......

非常感谢任何想法。

3 个答案:

答案 0 :(得分:1)

尝试禁用form1上的消息呈现:

   <p:messages autoUpdate="true" showDetails="true" rendered="#{bean.renderedmessage}"/>

在bean中,添加renderedmessage变量:

   public Boolean getRenderedmessage() {
   return renderedmessage;
   }

   /**
   * @param renderedmessage the renderedmessage to set
   */
   public void setRenderedmessage(Boolean renderedmessage) {
   this.renderedmessage = renderedmessage;
   }

并且,对于doCreateType()方法,添加:

  public void doCreateType(){
  ..............
  setRenderedmessage(false);
  .............
  }

更新form1后,您可以选择一些事件或方法,您可以在其中设置setRenderedmessage(true);

答案 1 :(得分:0)

您目前遇到的情况应该告诉您,您在同一个JSF视图中通常不需要两个<p:messages/>;一个就够了。

无论您的页面上有两个<h:form/>,但仍然只有一个FacesContext与该视图相关联(FacesContext对象是一个JSF构造,它封装了所有与给定的JSF页面请求相关联的信息/数据/组件等。

默认情况下,<p:messages/>会显示在FacesMessage 的关联实例中排队的每个FacesContext,无论消息来源如何(嗯,几乎:如果您在globalOnly="true"上设置<p:messages/>,则可以更改该行为)。


话虽如此,你基本上有两种选择:

  1. 摆脱额外的<p:messages/>并依靠(并适当地定位)只有一个来显示该视图的所有错误/警告

  2. 指定for属性,设置为所需的组件。这样做,您将保证只有一个输入组件可以触发其相关消息组件的显示。例如

    <h:form id="form1">
       <p:messages for="inputName" autoUpdate="true" showDetails="true" />
       <p:dataTable id='form1ID'>....</dataTable>
          <p:inputText id="inputName" value="#{bean.name}" required="true"
              requiredMessage="Please Enter Name!" label="Name ">
          </p:inputText>
    </h:form>
    

    请注意,我在id组件上设置了<p:inputText/>属性;这是必要的,因此您可以在for组件的messages属性中使用它。

  3. 进一步阅读:

答案 2 :(得分:0)

我已使用以下代码修复此问题

<p:messages autoUpdate="true" showDetails="true" visibility="info"/>  

所以它只是显示信息消息,其他弹出错误消息将不会播放。