0

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

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

请帮忙 :(

我想要的只是检查正则表达式验证器是否返回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>

我不认为 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 的值。加上命令按钮部分已更新,因此条件将被更新。

4

2 回答 2

0

与其他答案一样,onclick事件还为时过早,无法检查 JSF 请求的验证状态(使用!facesContext.validationFailed),因为该请求尚未提交;验证尚未运行,因此验证状态在onclick.

因此,您要做的是对该字段进行 ajax 验证(如前面的答案所示),然后使用 primefacesargs变量检查请求的状态:

<p:commandButton value="#{msgs.button_overwrite_all}" id="createReport" onclick="if(!args.validationFailed){confirmation.show();}"/>
于 2013-10-13T01:15:25.670 回答
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 的值。加上命令按钮部分已更新,因此条件将被更新。

于 2013-10-11T11:19:43.613 回答