我有一个带有输入字段和保存按钮的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>
答案 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();}"/>