2

我遇到了一些服务器端验证的问题,我不知道这是否是 XPages 中的预期行为,或者我是否在这里遗漏了一些简单的东西。

我有一个具有计算验证公式的字段 - 基本上,在设置 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>
&#160;
<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 做一些事情(为简单起见,我从示例中排除了数据源),但希望有比这更简单的解决方案。

4

2 回答 2

2

看起来问题在于对生命周期的误解。您正在指定 viewScope 变量中是否需要该字段。首次加载页面时,viewScope 为 false,因此该字段不是必需的。提交后,viewScope 变量被设置,页面再次呈现。只是现在该字段成为必填字段,但仅在下次提交表单时才需要。

如果您希望该字段是必需的,则需要在提交表单之前将 required 属性评估为 true 并传递给浏览器。

您尝试管理的功能有许多替代方案,运行 SSJS 并在满足某些条件时失败。

一种是使用验证器属性而不是计算所需属性。验证器允许您运行代码,但您需要使用 this.getSubmittedValue() 来检查字段的值 - 验证器在将提交的值传递给 value 属性之前在生命周期的早期运行。

第二个选项是将验证放在提交按钮中。您可以使用 facesContext.addMessage()。如果你 google xpages facesContext addMessage 有很多例子说明如何做到这一点。然后执行“return false”以中止。

于 2012-09-06T21:16:13.410 回答
1

看起来您可能需要条件验证。不久前,我写了一篇关于此的博文:

使验证行为正常

于 2012-09-07T05:35:08.973 回答