在xpage上,我将验证绑定到对象的状态(草稿,批准,批准(。
<xp:inputText
id="inpHighRiskCountry" styleClass="inputEscalation"
value="#{matterBean.matter.escHighRisk}"
validator="#{matterValidators.valEscHighRiskCountry}"
disabled="#{!matterBean.matter.editable}">
<xp:this.attrs>
<xp:attr name="placeholder"
value="#{matter.gen_EnterCountry}" />
</xp:this.attrs>
<xp:this.validators>
<xp:validateRequired
message="#{matter.msg_valid_esc_high_risk}" />
</xp:this.validators>
<xp:this.required><![CDATA[#{!(matterBean.matter.status eq "For approval")}]]></xp:this.required>
</xp:inputText>
在状态草稿(默认值(中,不需要验证。在发送到批准之前,我希望进行验证。
我该如何启动此操作?(例如,随时启动验证(
现在,我在"发送以供批准"按钮下有一个尝试将对象保存在后端的功能。因此,首先它将状态设置为"用于审批",保存对象。我想让它"执行验证",设置状态,保存对象。
我正在对现有应用程序进行网络化,因此我怀疑是否可以引入"介于两者之间"状态。
我认为您错误地混合了几件应该分开的事情:UI 交互和业务逻辑。
真正的 UI 交互尝试通过要求某些特定值在继续之前存在且有效来模拟业务逻辑。但正如你所看到的,它并不总是完美地完成,因为业务逻辑可能需要更详细的检查,就像在这种情况下一样。
但是我看不出问题出在哪里。JSF 仍然可以帮助您在需要的输入上返回错误。如果我要解决这个问题,我会删除所需的属性 - 和验证器文本 - 在操作级别进行检查,正如您已经发现的那样,只是我会在保存文档之前执行此操作,而不是由于保存失败。
您可以简单地将其作为一般错误附加,或者,如果您仍想将其绑定到特定输入,则执行此操作。
让我们采用第二种方法:
<xp:inputText binding="#{inpHighRiskCountry}"
id="inpHighRiskCountry" styleClass="inputEscalation"
value="#{matterBean.matter.escHighRisk}"
readonly="#{!matterBean.matter.editable}">
<xp:this.attrs>
<xp:attr name="placeholder"
value="#{matter.gen_EnterCountry}" />
</xp:this.attrs>
</xp:inputText>
<xp:message for="inpHighRiskCountry" />
<xp:button id="button1" value="Save">
<xp:eventHandler event="onclick" submit="true"
action="#{matterBean.sendToApproval}" />
</xp:button>
对于输入文本,我设置了binding
选项,因为我认为从 bean 方法获取输入会更容易。然后,我放置了用于显示输入错误的xp:message
组件和一个愚蠢的按钮,该按钮假设调用发送到批准操作。
public void sendToApproval() {
if (...) { // check your escHighRisk logic here
FacesContext facesContext = FacesContext.getCurrentInstance();
UIComponent component = facesContext
.getApplication()
.getVariableResolver()
.resolveVariable(facesContext,
"inpHighRiskCountry");
String errorSummary = "Your error here";
FacesUtil.addMessage(
facesContext,
FacesMessage.SEVERITY_ERROR,
component,
errorSummary,
null;
return;
}
// Code would continue here with saving or whatever else
}