【问题标题】:JSF command button updating even there are validation errors即使存在验证错误,JSF 命令按钮也会更新
【发布时间】:2014-06-10 20:10:10
【问题描述】:

我是 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 命令按钮时,它将完美显示错误消息,因为我添加了 &lt;p:messages autoUpdate="true" showDetail="true"/&gt;

对我来说,坏事或令人惊讶的是,它在 form1 顶部显示错误消息也可能是因为在 form1 中添加了&lt;p:messages autoUpdate="true" showDetail="true"/&gt;,我正在尝试在 form2 中单击命令按钮时更新 form1。 当 form2 抛出验证错误消息时,我不想在 form1 上显示错误消息。我怎样才能解决这个问题 ?我用谷歌搜索了它..但找不到解决方案。

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

高度赞赏任何想法。

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

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

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

    并在 bean 中,添加 rendermessage 变量:

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

    【讨论】:

      【解决方案2】:

      您当前遇到的情况应该向您表明,您通常不需要在同一个 JSF 视图中使用两个 &lt;p:messages/&gt;s;一个就够了。

      尽管您的页面上有两个&lt;h:form/&gt;s,但仍然只有一个FacesContext 与该视图关联(FacesContext 对象是一个封装所有信息/数据/组件等的 JSF 构造与给定的 JSF 页面请求相关联)。

      默认情况下,&lt;p:messages/&gt; 将显示在其关联的FacesContext 实例中排队的每个FacesMessage,无论消息的来源如何(好吧,几乎:如果您设置@ &lt;p:messages/&gt; 上的 987654329@,您可以更改该行为)。


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

      1. 摆脱多余的&lt;p:messages/&gt; 并仅依靠(并适当定位)一个来显示该视图的所有错误/警告

      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>
        

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

      进一步阅读:

      【讨论】:

        【解决方案3】:

        我已经使用以下代码解决了这个问题

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-14
          • 2012-11-04
          • 2017-12-24
          • 1970-01-01
          • 2013-06-16
          • 1970-01-01
          • 1970-01-01
          • 2019-10-18
          相关资源
          最近更新 更多