Xpages-CKEditor中的富文本验证。。。失去内容

Xpages-CKEditor中的富文本验证。。。失去内容,ckeditor,xpages,Ckeditor,Xpages,平台:DominoV9 背景: 当用户使用Xpage打开文档时,富文本控件(CKEditor)将显示该文档中的现有内容 RichText字段绑定到后端Notes文档 当用户对此内容进行任何更改并单击“更新”按钮时,将进行验证(在本例中,我们将检查长度是否超过20个字符) 使用ValidateExpression选项完成验证 验证时,用户看到错误消息,但用户输入的新内容丢失。富文本控件显示原始内容 验证码 ]+)>)/免疫球蛋白; contentStr=contentStr.replace(re

平台:DominoV9

背景: 当用户使用Xpage打开文档时,富文本控件(CKEditor)将显示该文档中的现有内容

RichText字段绑定到后端Notes文档

当用户对此内容进行任何更改并单击“更新”按钮时,将进行验证(在本例中,我们将检查长度是否超过20个字符)

使用ValidateExpression选项完成验证

验证时,用户看到错误消息,但用户输入的新内容丢失。富文本控件显示原始内容

验证码

]+)>)/免疫球蛋白;
contentStr=contentStr.replace(regex.);
如果(contentStr.length<20){
返回true;
}否则{
返回false;
}
}]]>
我尝试过的事情: 我尝试了Tommy Valand的博客中提到的解决方案,但没有解决问题

问题: 如何在不丢失新内容的情况下验证RichText控件

截图:


当我进行复杂验证时,有时会使用隐藏的输入字段进行验证。不确定这在这种情况下是否有帮助,但值得一试

getLocalValue应在验证阶段返回转换后的值。因为您处理的是字符串,所以getSubmittedValue可能更适合/更易于使用

如果使用xp:message,请将for属性设置为您为隐藏字段决定的任何id

<xp:inputHidden id="dummyValidatorField" value="dummyValue">
<xp:this.validators>
    <xp:validateExpression>
        <xp:this.expression><![CDATA[#{javascript:var contentStr = getComponent( 'idOfRtField' ).getLocalValue(); // maybe you need to append .getContentAsText();
        var regex = /(<([^>]+)>)/ig ;
        contentStr = contentStr.replace(regex,'');
        if( contentStr.length < 20 ) {
          return true;
        }else{
           return false;
        }
        }]]></xp:this.expression>
        <xp:this.message><![CDATA[#{javascript:var errMsg  = getErrorMessageText   ('713','');
        if ( errMsg != null && errMsg != "") {
        //return errMsg;
        return "Length cannot exceed 20 characters";
           }else{
        return "Length cannot exceed 20 characters";
        }}]]></xp:this.message>
    </xp:validateExpression>
</xp:this.validators>

]+)>)/免疫球蛋白;
contentStr=contentStr.replace(regex.);
如果(contentStr.length<20){
返回true;
}否则{
返回false;
}
}]]>

奇怪的行为。也许您可以通过CSJS(而不是SSJS/Java)验证您的RTF控制,使用最近添加的代码片段:

您不能添加一个CKEditor插件来限制客户端的字符数吗?我知道这并不能回答问题,但似乎能解决所述问题。马基,谢谢你的建议。在这个客户端站点上,我们必须只进行服务器端验证。客户端不是我可以使用的选项。按设计工作。在JSF生命周期中,失败的验证阻止将提交的值存储在后端模型中。因此,在您的情况下,使用客户端验证,或在RT组件之外进行验证,这样验证将阻止保存,但将允许使用提交的值更新组件。Jack-meh-在这种情况下,两者都做,我可以说限制字段长度不是验证:)Frantisek,您提出的将验证转移到外地的建议奏效了。将所有验证检查移动到“提交”按钮,它就工作了。我的问题是,为什么这只影响富文本控件?在我的页面上,我有其他文本字段,如收件人、抄送、密件抄送,用户在其中输入电子邮件地址。在这些字段中,如果用户输入的地址无效,则错误消息将显示在底部,错误的电子邮件仍将显示在字段中。该字段不会丢失此新内容。为什么文本和富文本字段之间的行为存在这种差异?谢谢。汤米,谢谢你的建议。尝试使用隐藏字段的方法,但没有任何区别。
<xp:inputHidden id="dummyValidatorField" value="dummyValue">
<xp:this.validators>
    <xp:validateExpression>
        <xp:this.expression><![CDATA[#{javascript:var contentStr = getComponent( 'idOfRtField' ).getLocalValue(); // maybe you need to append .getContentAsText();
        var regex = /(<([^>]+)>)/ig ;
        contentStr = contentStr.replace(regex,'');
        if( contentStr.length < 20 ) {
          return true;
        }else{
           return false;
        }
        }]]></xp:this.expression>
        <xp:this.message><![CDATA[#{javascript:var errMsg  = getErrorMessageText   ('713','');
        if ( errMsg != null && errMsg != "") {
        //return errMsg;
        return "Length cannot exceed 20 characters";
           }else{
        return "Length cannot exceed 20 characters";
        }}]]></xp:this.message>
    </xp:validateExpression>
</xp:this.validators>