我遇到了一些服务器端验证的问题,我无法判断这是否是XPage中的预期行为,或者我是否遗漏了一些简单的内容。
我有一个具有计算验证公式的字段 - 基本上,当viewScope变量设置时,它变为必需。
我的提交按钮设置了viewScope并进行了全面刷新。
我希望提交表单,验证验证公式,如果失败则会显示验证失败。但是当我点击我的提交按钮时,表单会被提交而不会出错。如果我再次单击它,验证将按预期失败。
为了说明我的问题,我创建了一个简单的例子:
<xp:inputText id="inputText1" required="#{javascript:viewScope.validate}">
<xp:this.validators>
<xp:validateRequired message="This field is required."></xp:validateRequired>
</xp:this.validators>
</xp:inputText>
 
<xp:button value="Submit" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" immediate="false" save="true">
<xp:this.action><![CDATA[#{javascript:viewScope.validate=true;}]]></xp:this.action>
<xp:this.script><![CDATA[dojo.attr(dojo.byId("#{id:inputText1}"),"aria-required","true")]]></xp:this.script>
</xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:message id="message1" for="inputText1"></xp:message>
正如您所看到的,我还尝试在按钮中添加带有csjs的aria-required属性,希望它能够启动验证。
如果验证按预期工作,是否有任何建议让这样的动态验证正常运行?我知道我可以在数据源上使用querySave做一些事情(为了简单起见,我从示例中排除了数据源),但希望有一个比这更简单的解决方案。
答案 0 :(得分:2)
看起来问题是对生命周期的误解。您要指定viewScope变量中是否需要该字段。首次加载页面时,viewScope为false,因此不需要该字段。提交后,将设置viewScope变量,再次呈现页面。只有现在才需要该字段,但只有在下次提交表单时才需要该字段。
如果您希望该字段是必需的,则需要将所需的属性评估为true,并在提交表单之前将其传递给浏览器。
您尝试管理的功能有很多替代方案,如果满足某些条件,则运行SSJS并失败。
一种是使用验证器属性而不是计算所需的属性。验证器允许您运行代码,但是您需要使用this.getSubmittedValue()来检查字段的值 - 验证器在submissionValue传递给value属性之前的生命周期中运行。
第二个选项是将验证放在“提交”按钮中。您可以使用facesContext.addMessage()。如果你google xpages facesContext addMessage有很多如何做的例子。然后执行“return false”以中止。
答案 1 :(得分:1)
看起来您可能需要条件验证。我写了一篇关于这篇文章的博文: