如何禁止XPages中的inputText中的双引号?

时间:2015-09-08 19:54:43

标签: regex xpages

我一直试图禁止用户在JSON字符串中使用的某些字段中输入双引号(“),因为它们会导致字符串中值的意外终止。不幸的是,虽然正则表达式并不难写道,我无法让它在XPages中工作。

我尝试单独使用双引号并使用转义字符。两种方式都会失败任何字符串,而不仅仅包括双引号。

<xp:validateConstraint message="Please do not use double quotes in organization/vendor names">
    <xp:this.regex><![CDATA['^[^\"]*$]]></xp:this.regex>
</xp:validateConstraint>

必须有一个简单的方法解决这个问题。

4 个答案:

答案 0 :(得分:4)

我认为您的 xp:validateConstraint 验证程序遇到了正则表达式属性的问题。您似乎试图剥离 xp:this.regex as opposed to specifying what characters are allowed, as I believe the docs read中的字符。我可能会建议查看 xp:customConverter (偏见:我更熟悉 customConverter ),这使您能够更改 getValueAsObject getValueAsString 方法;然后你可以逃避不受欢迎的角色。

这就是我正在考虑的事情,将它们剥离出来。如果将其插入到XPage中,您会发现当拉取值时(例如通过部分刷新),它会通过删除引号(在我的情况下为单引号和双引号)来相应地转换输入内容。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputTextarea
        id="inputTextarea1"
        value="#{viewScope.myStuff}"
        disableClientSideValidation="true">
        <xp:this.converter>
            <xp:customConverter>
                <xp:this.getAsString><![CDATA[#{javascript:return value.replace(/["']/g, "");}]]></xp:this.getAsString>
                <xp:this.getAsObject><![CDATA[#{javascript:return value.replace(/["']/g, "");}]]></xp:this.getAsObject>
            </xp:customConverter>
        </xp:this.converter>
    </xp:inputTextarea>
    <xp:button
        value="Do Something"
        id="button1">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="partial"
            refreshId="computedField1" />
    </xp:button>
    <xp:text
        escape="true"
        id="computedField1"
        value="#{viewScope.myStuff}" />
</xp:view>

我与上述代码的互动产生: interactive with the code provides a converter object against the bound viewScope object

请注意,为了反映在刷新中,我正在修改 getAsString getAsObject ,因为它正在更新<刷新过程中的em> viewScope 'd 对象(事实上我不得不提醒自己),但保存到XPage中的文本字段将通过 getAsString <获取值/ em>(前提是您的数据源知道其与字符串相关的字段,例如 NotesXspDocument document1 ,具有已知表单,其中该字段为文本字段)。

正如上面的评论所提到的,这会执行过滤输入值的行为,而不是转义或验证这些值。您还可以将我的替换方法更改为替换为文本转义字符return value.replace(/"/g,"\"").replace(/'/g,"\'");

答案 1 :(得分:3)

简单的答案是在提交按钮上添加JavaScript函数调用以删除引用吗?

更优雅的解决方案是不允许通过检查keydown事件并阻止该字符代码来键入引号。用户不应该能够键入一个东西,然后在处理中更改它们

答案 2 :(得分:2)

@Eric McCormick建议使用customConverter,在我看来这是一个很好的解决方案,在很多情况下我可能会这样做。但有时我们需要教导用户遵守规则,因此我们必须向他们展示他们做错的地方。那时我们可能需要validator

我想出的最简单的解决方案是xp:validateExpression只是在输入的字符串中查找第一次出现的双引号:

<xp:inputText
    id="inputText1"
    value="#{viewScope.testvalue}">
    <xp:this.validators>
        <xp:validateExpression
            message="Hey, wait! Didn't I tell you not to use double quotes in here?">
            <xp:this.expression><![CDATA[#{javascript:value.indexOf("\"")==-1}]]></xp:this.expression>
        </xp:validateExpression>
    </xp:this.validators>
</xp:inputText>

如果在您的应用程序中出现这种情况,那就是它。如果你需要这个和类似的解决方案,你可能想要编写一个小的验证器bean(java),通过faces-config.xml注册它,然后在你的应用程序的任何地方使用它,例如使用{{ 1}}而不是

答案 3 :(得分:0)

正如@Tomalik和@sidyll所建议的,这是尝试解决错误的问题。虽然提供的每个答案都解决了防止用户输入不良字符的问题,但最好对这些字符进行编码以保留用户的输入。在这种特殊情况下,通过JSON字符串向用户提供数据的中间步骤是从视图中提取值。

因此,我所要做的就是更改列公式以使用UTF-8字符集对字符串进行编码,并使用&#34;不良字符&#34;显示值。未编码的值存储在文档中,以便旧Notes访问不会造成混淆。

@URLEncode ("UTF-8"; vendorName )

在一种情况下,JSON是作为表单设计的一部分计算的,但同样的解决方案也可以。