1

我难住了。我在 xpage 中有一个输入字段,我在其中添加了一个自定义验证器。无论我尝试什么,我都无法触发自定义验证器。还有一个 validateRequired 可以按预期工作。错误消息被发送到“显示错误”控件,客户端验证被禁用。自定义验证器的目标是检查是否输入了有效日期。在我让它工作之后,我还计划添加其他复杂的验证,例如检查一周中的有效日期。

打印语句正常工作,如控制台中的“inside true”显示有效日期,“inside false”显示无效日期。如果我在 if 语句之后添加一个测试打印语句,它不会像你想象的那样执行。对于任何一种情况,都不会显示消息,并提交页面。

我尝试过同时使用 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>
4

3 回答 3

3

customValidator 必须返回一个带有错误消息的字符串——而不是真或假。

因此,在您的情况下,请改为执行以下操作:

<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>
于 2013-06-07T05:12:41.933 回答
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 并将组件的 valid 属性设置为 false。

于 2013-06-07T15:46:54.010 回答
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>
于 2013-06-07T16:28:31.280 回答