服务器端验证 - 计算viewScope所需的参数

时间:2012-09-06 14:08:08

标签: xpages

我遇到了一些服务器端验证的问题,我无法判断这是否是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>
&#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做一些事情(为了简单起见,我从示例中排除了数据源),但希望有一个比这更简单的解决方案。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

看起来您可能需要条件验证。我写了一篇关于这篇文章的博文:

Making validation behave properly