Xpage自定义控制/中继器数据保存问题

时间:2014-05-05 15:05:24

标签: xpages lotus-notes

这是上一个问题的延续,我问last week

我有一个XPage。在这个XPage上我有一个转发器。在这个转发器中,我有一个自定义控件,用于显示自己的数据源的内容 - 一个NotesXspDocument。该控制重复5至10次,可能重复15次。我不想让用户按下每次重复控制的保存,所以我使用上面链接问题中描述的提交按钮功能。

当用户按下提交按钮时,我在事件选项卡上使用querySaveDocument和postSaveDocument操作(我还尝试了数据选项卡中具有相同名称的属性,结果相同)。我的问题如下:

验证将在另一个控件实例之后执行,直到验证失败并立即保存数据源,然后再转到下一个实例。保存新文档时,似乎XspDocument已消失且字段已清空。我已经检查过,我已经设置了数据源范围来查看,因为这种行为在某种程度上类似于requestScope。只要我重新加载页面,就会正确显示信息。

我可以使用" context.reloadPage()"只是获取更新的信息,但这会产生令人讨厌的副作用,即删除所有未保存的信息(例如,如果在第x行上验证失败)。我怎样才能最好地解决/解决这个问题?我应该注意什么?有没有人见过这样的行为?

我想在Containing XPage的所有行上调用validate函数,然后如果所有行都成功,则调用saveDataSources函数。任何帮助是极大的赞赏!

2 个答案:

答案 0 :(得分:1)

我真的不知道你想要做什么,所以我只是评论一件作品。 如果你想让数据在context.reloadPage()中存活,我想你需要将你的控件绑定到sessionScope。在重新加载期间,ViewScope可能已被清除,但sessionScope仍应可用。

祝你好运!

答案 1 :(得分:1)

重复控制之外的一个简单按钮就可以了。我创建了这个例子:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:repeat id="repeat1" rows="30" value="#{javascript:4}">
        <xp:panel id="dataPanel" disableOutputTag="true">
            <xp:this.data>
                <xp:dominoDocument var="document1" formName="Demo2">
                </xp:dominoDocument>
            </xp:this.data>
            <xp:table>
                <xp:tr>
                    <xp:td>
                        <xp:label value="Subject!" id="subject_Label1" for="subject1">
                        </xp:label>
                    </xp:td>
                    <xp:td>
                        <xp:inputText value="#{document1.Subject}"
                            id="subject1" required="true">
                            <xp:this.validators>
                                <xp:validateRequired
                                    message="Say something">
                                </xp:validateRequired>
                                <xp:validateLength minimum="5"
                                    message="Say 5 characters or more">
                                </xp:validateLength>
                            </xp:this.validators>
                        </xp:inputText>
                    </xp:td>
                </xp:tr>
                <xp:tr>
                    <xp:td>
                        <xp:label value="Color!" id="color_Label1" for="color1">
                        </xp:label>
                    </xp:td>
                    <xp:td>
                        <xp:comboBox value="#{document1.Color}"
                            id="color1" defaultValue="red">
                            <xp:this.validators>
                                <xp:validateExpression
                                    message="We don't like red">
                                    <xp:this.expression><![CDATA[#{javascript:value != "red"}]]></xp:this.expression>
                                </xp:validateExpression>
                            </xp:this.validators>
                            <xp:selectItem itemLabel="red"></xp:selectItem>
                            <xp:selectItem itemLabel="yellow"></xp:selectItem>
                            <xp:selectItem itemLabel="green"></xp:selectItem>
                            <xp:selectItem itemLabel="blue"></xp:selectItem>
                            <xp:selectItem itemLabel="white"></xp:selectItem>
                            <xp:selectItem itemLabel="black"></xp:selectItem>
                        </xp:comboBox>
                    </xp:td>
                </xp:tr>
            </xp:table>
        </xp:panel>
    </xp:repeat>

    <xp:messages layout="table" style="color:red" id="messages1">
    </xp:messages>

    <xp:button value="Save?" id="button1">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete" immediate="false" save="true"></xp:eventHandler>
    </xp:button>

</xp:view>

除非满足所有验证,否则它不会保存任何数据,也不会删除任何输入的数据。不要试图XPages自动执行的操作(你也不要在她的皮毛上刷猫)。您的验证应该在验证器中进行,并通过按钮保存数据源。如您所见:此处不需要查询/发布事件代码。