时间:2013-10-11 08:56:26

标签: jsf primefaces validation facescontext

我有一个带有输入字段和保存按钮的jsf表单,如下面的代码所示。我想要实现的是,当单击保存按钮时,应使用正则表达式模式验证输入。如果验证失败,则不应显示保存确认对话框。否则显示保存确认对话框,让用户选择是否保存。

在下面的代码中,尽管有条件的onclick =“if(#{conditionOK}),但总是显示对话框。我想要没有显示确认对话框,当conditionOK返回false时!!!经过多次尝试,我认为facescontext.isValidateFailed()不会被重新评估。

请帮助:(

我想要的只是检查,如果regex-Validator返回true。对于这种情况,应显示确认对话框。

我的做法可能是错的。非常感谢你们有其他解决方案。

<h:form id="save_all_form">
      <p:inputTextarea rows="1" style="width:100%;resize:none"
         value="#{cusBean.saveAll}" autoResize="false"
         validatorMessage="Wrong format">
         <f:validateRegex pattern="#{msgs.pattern}" />
      </p:inputTextarea>

      <ui:param name="conditionOK" 
         value="#{facesContext.postback and !facesContext.validationFailed}"  />

      <p:commandButton value="#{msgs.button_overwrite_all}"
         onclick="if(#{conditionOK}){confirmation.show()}"/>
</h:form>

2 个答案:

答案 0 :(得分:0)

我认为JSF验证不是你的选择。它旨在防止在验证失败的情况下更改模型数据 如果您想在JavaScript中进行检查,则必须更新HTML中的部分。 JavaScript不会重新评估Expression,因此每次都会使用第一次呈现视图时的值。

在xhtml中尝试以下内容:

<h:form id="save_all_form">
  <p:inputTextarea id="input" rows="1" style="width:100%;resize:none"
     value="#{cusBean.saveAll}" autoResize="false">
     <p:ajax global="false" update="input submit" partialSubmit="true"/>
  </p:inputTextarea>

  <p:commandButton id="submit" value="#{msgs.button_overwrite_all}"
     onclick="if(#{cusBean.validate(msgs.pattern)}){confirmation.show()}"/>
</h:form>

并在CusBean中添加此方法:

public boolean validate(String pattern) {
  return getSaveAll().matches(pattern);
}

结果是,没有进行JSF验证,每次更改时都会提交textArea的值。此外,commandButton-section已更新,因此条件将更新。

答案 1 :(得分:0)

与解释的另一个答案onclick一样,检查JSF请求的验证状态(使用!facesContext.validationFailed)为时尚早,因为尚未提交请求;验证尚未运行,因此在onclick期间验证状态始终为false(好吧,排序)。

所以你要做的是对字段执行ajax验证(如前面的答案中所示),然后使用primefaces args变量来检查请求的状态:

<p:commandButton value="#{msgs.button_overwrite_all}" id="createReport" onclick="if(!args.validationFailed){confirmation.show();}"/>