我的xhtml包含输入字段,用户可以输入数字或字母值。使用ajax调用我正在验证输入值并在上面抛出验证错误。但即使输入无效字符和错误消息后,用户仍然可以点击“保存”按钮。一旦用户点击“保存”按钮,它就会在Controller中触发一个方法。有没有办法可以使用FacesContext.getCurrentInstance()检查控制器内p:消息的验证错误。
xhtml代码
<!-- Messages -->
<p:messages id="errorMessages" globalOnly="false" showDetail="true" showSummary="false" closable="true" />
<!-- Column input field-->
<p:column>
<f:facet name="header">
<h:outputText value="Input Amount" escape="false" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.amount}" escape="false">
<f:convertNumber maxFractionDigits="3" minFractionDigits="3"
maxIntegerDigits="5" />
</h:outputText>
</f:facet>
<f:facet name="input">
<p:inputText id="input" value="#{row.amount}" maxlength="10"
size="10">
<f:convertNumber maxFractionDigits="3" minFractionDigits="3"
maxIntegerDigits="5" />
<f:validator validatorId="hourlyValueValidator" for="input" />
<p:ajax event="change" partialSubmit="true" process="input"
update=":#{p:component('errorMessages')}" />
</p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<!-- Save Button -->
<p:commandButton id="btnSubmit" value="Save"
update=":#{p:component('tblScrollPnl')} :#{p:component('errorMessages')}"
action="#{controller.saveValues()}" ajax="true" />
ViewScope中的控制器
public void saveValues() throws Exception {
FacesContext context = FacesContext.getCurrentInstance();
List<FacesMessage> errorMsgList = context.getMessageList("globalMessages");
......
......
......
}
答案 0 :(得分:1)
您不需要从bean端获取消息进行验证,正如您所经历的那样,查看边验证会发生,但不会阻止您的操作。
您的视图中存在一些错误,要解决您需要更改process
的{{1}}属性所需的问题,或者只处理按钮(默认为p:commandButton
} ,因此跳过验证。
process="@this"
另请注意,我已删除<p:commandButton id="btnSubmit" value="Save" process="@form" update=":tblScrollPnl :errorMessages" action="#{controller.saveValues()}" />
,因为它是默认设置并修复了ajax="true"
中的主要问题。
您还应该重新排列验证器:
update=""