【问题标题】:jsf primefaces validation message repeatedly displayedjsf primefaces验证消息重复显示
【发布时间】:2012-06-20 05:01:47
【问题描述】:

我正在使用 primefaces 3.3。

我有一个如下所示的数据表:

<p:dataTable value="#{someBean.items}" var="item" ..>
  <p:column>
    <p:inputText id="someInputText" validation="#{someBean.someValidator}">
  </p:column>
  ..
</p:dataTable>

验证器是标准的:

public void someValidator (FacesContext context, UIComponent component, Object value) throws ValidatorException {

  if(someCondition) {
    throw new ValidatorException(
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "error: ", "validation failed"));
  }

我遇到的问题是,如果 dataTable 中有多个项目,并且 inputText 组件“someInputText”的验证仅针对其中一个项目失败,那么每个项目都会显示验证错误消息。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 您的页面上是否有一个 组件来捕获全局错误?和/或每个输入字段都有 吗?还是您的代码就像上面那样没有 也没有 组件?

标签: jsf primefaces datatable message


【解决方案1】:

像这样使用 p:message 的 for 属性:

<p:dataTable value="#{someBean.items}" var="item">
  <p:column>
    <p:inputText id="someInputText1" validator="#{someBean.someValidator}" value="item.name">
    <p:message id="someInputText1Msg" for="someInputText1" />
  </p:column>
  <p:column>
    <p:inputText id="someInputText2" validator="#{someBean.someValidator}" value="item.model">
    <p:message id="someInputText2Msg" for="someInputText2" />
  </p:column>
</p:dataTable>

【讨论】:

  • 只是为了确保:您还可以将 redisplay-Attribute 设置为 false。有了这个已经呈现的消息将不会再次显示。干杯!
  • 谢谢您的回答。我试过了,但没有用。抱歉,您似乎没有理解我的问题。我的意思是,对于 dataTable 中的每个单独的项目(对象),都有一些 inputText 重复。例如,第一个项目的 inputText 的 id 将是“someDataTable:0:someInputText”,第二个“someDataTable:1:someInputText”等。 inputText 组件只是为每个项目(对象)重复。我的问题是,如果一个项目 inputText 通过验证,而另一个没有,则两个 inputTexts 都会显示验证消息。
  • 如果您观察到 clientIds someDataTable:0:someInputText 和 someDataTable:1:someInputText。 someDataTable 是数据表的 id,然后是 rowindex,然后是 someInputText,它是您的 inputText 的 id。您对 inputText 使用相同的 ID,您需要为每一行的 inputText 提供唯一的 ID,然后通过 for 属性引用它,使其仅显示该特定 inputText 的消息。
【解决方案2】:

修改您对新 FacesMessage 的创建以使用 component.getClientId() 而不是“error:”。

即:

if(someCondition) {
    throw new ValidatorException(
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, component.getClientId(), "validation failed"));
  }

【讨论】:

  • 请在评论中查看我的问题以了解您的原始问题,如果以下内容不能解决您的问题,请回复
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2016-02-29
  • 2013-06-05
  • 2011-09-18
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多