我很难过。我在xpage中有一个输入字段,我添加了一个自定义验证器。无论我尝试什么,我都无法启动自定义验证器。还有一个validateRequired可以按预期工作。错误消息将发送到“显示错误”控件,禁用客户端验证。自定义验证器的目标是检查是否输入了有效日期。在我开始工作之后,我还计划添加其他复杂的验证,例如检查一周中的有效日期。
print语句正常工作,如在“inside true”中在控制台中显示有效日期,“inside false”显示无效日期。如果我在if语句之后添加一个测试print语句,它就不会像你想象的那样执行。对于任一情况,都不会显示消息,并且会提交页面。
我尝试过使用getValue()和getSubmittedValue。我也试过返回facesMessage和一个字符串。我也很乐意接受更好的方法。
<xp:inputText id="datepicker" styleClass="datepicker"
value="#{viewScope.arrivalDate}"
defaultValue="#{javascript:statusBean.arrivalDate}"
disableClientSideValidation="true">
<xp:this.validators>
<xp:validateRequired message="Please enter the arrival date">
</xp:validateRequired>
<xp:customValidator message="err" loaded="true">
<xp:this.validate><![CDATA[#{javascript:var datepicker = getComponent("datepicker").getSubmittedValue();
var testDate = @IsTime(@TextToTime(datepicker));
print("testDate=" + testDate);
if(testDate == 0){
print("inside false");
return false;
} else if(testDate == 1){
print("inside true");
return true;
}}]]>
</xp:this.validate>
</xp:customValidator>
</xp:this.validators>
答案 0 :(得分:3)
customValidator必须返回一个包含错误消息的字符串 - 而不是true或false。
所以在你的情况下,请改为:
<xp:customValidator message="err" loaded="true">
<xp:this.validate><![CDATA[#{javascript:
var datepicker = getComponent("datepicker").getSubmittedValue();
var testDate = @IsTime(@TextToTime(datepicker));
print("testDate=" + testDate);
if(testDate == 0){
print("inside false");
return "Invalid date";
}
}]]></xp:this.validate>
</xp:customValidator>
答案 1 :(得分:3)
我没有尝试使用自定义验证器,但是这是我去年在LUGs的示例演示中放入验证器属性的SSJS:
<xp:this.validator>
<![CDATA[#{javascript:var sv = this.getSubmittedValue();
print ("Checking submitted value for input1 '" + sv + "' is more than 5 characters");
print ("Value for input1 is " + this.getValue());
if (sv.length < 5) {
var msgStr = "You must enter your FULL name, which will be more than 5 characters!";
var msgObj = new javax.faces.application.FacesMessage(javax.faces.application.FacesMessage.SEVERITY_ERROR, msgStr, msgStr);
facesContext.addMessage(getClientId(this.getId()), msgObj);
this.setValid(false);
}}]]>
</xp:this.validator>
请注意,它会添加facesMessage,并将组件的有效属性设置为false。
答案 2 :(得分:1)
这是我使用xSnippet的版本 - postValidationError。
<xp:customValidator>
<xp:this.validate><![CDATA[#{javascript:
if (@IsTime(@TextToTime(@Trim(value))) == 0){
postValidationError(this, "Please enter a valid Date/Time")
}
}]]></xp:this.validate>
</xp:customValidator>