无法启动Custom Validator

时间:2013-06-06 21:57:48

标签: xpages

我很难过。我在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>

3 个答案:

答案 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>