我一直试图禁止用户在JSON字符串中使用的某些字段中输入双引号(“),因为它们会导致字符串中值的意外终止。不幸的是,虽然正则表达式并不难写道,我无法让它在XPages中工作。
我尝试单独使用双引号并使用转义字符。两种方式都会失败任何字符串,而不仅仅包括双引号。
<xp:validateConstraint message="Please do not use double quotes in organization/vendor names">
<xp:this.regex><![CDATA['^[^\"]*$]]></xp:this.regex>
</xp:validateConstraint>
必须有一个简单的方法解决这个问题。
答案 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>
请注意,为了反映在刷新中,我正在修改 getAsString 和 getAsObject ,因为它正在更新<刷新过程中的em> viewScope 'd 对象(事实上我不得不提醒自己),但保存到XPage中的文本字段将通过 getAsString <获取值/ em>(前提是您的数据源知道其与字符串相关的字段,例如 NotesXspDocument 为 document1 ,具有已知表单,其中该字段为文本字段)。
正如上面的评论所提到的,这会执行过滤输入值的行为,而不是转义或验证这些值。您还可以将我的替换方法更改为替换为文本转义字符return value.replace(/"/g,"\"").replace(/'/g,"\'");
。
答案 1 :(得分:3)
简单的答案是在提交按钮上添加JavaScript函数调用以删除引用吗?
更优雅的解决方案是不允许通过检查keydown事件并阻止该字符代码来键入引号。用户不应该能够键入一个东西,然后在处理中更改它们
答案 2 :(得分:2)
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是作为表单设计的一部分计算的,但同样的解决方案也可以。