我希望有人可以帮助我解决我们目前面临的一个非常严重的问题,即当用户在其中工作时,关键业务应用程序会丢失数据。
这是随机发生的——我从未复制过,但系统中的用户比我多得多。
创建了一个文档,上面有很多字段,并且有 2 个富文本字段。我们使用的是 Domino 8.5.3 - 没有使用扩展库控件。该文档内置了工作流,所有验证都由从数据查询保存事件调用的 SSJS 函数完成。sessionscope.log 有大量的日志记录,并且(现在)在笔记文档中为每个用户捕获了这些记录,因此我可以查看他们在做什么。
有时,用户进入工作流程步骤,他们必须填写富文本字段并在下拉字段中做出选择,然后他们使用工作流程按钮提交文档。当按下工作流按钮(进行完整更新)时,一些客户端 JS 首先运行
// Process any autogenerated submit listeners
if( XSP._processListeners ){ // Not sure if this is valid in all versions of XPages
XSP._processListeners( XSP.querySubmitListeners, document.forms[0].id );
}
(我添加这个是为了防止 RTF 字段在阅读博客后丢失它们的值,但到目前为止它不起作用)
然后服务器端事件运行并调用 view.save() 以触发 QS 代码(用于验证)和 PS 代码以在服务器上运行工作流代理。
95%的时间,这工作正常。
但是,有 5% 的时间,页面会刷新对 RFT 字段 (CKEditor) 和下拉字段所做的所有更改,都像以前一样重新加载,没有内容。就像保存没有发生一样,完全更新按钮决定像页面刷新而不是提交一样工作。
在正常情况下,日志显示当按下工作流按钮时,QuerySave 代码启动并返回 True。然后记录按下的工作流按钮的 ID(这样我可以在查看问题时看到正在使用哪些按钮),然后 PostSave 代码开始并最终返回 true。
出现问题时,QuerySave 事件运行,如果验证通过则返回 true,如果验证失败则返回 false,然后停止。工作流按钮的 ID 也会被记录下来。但是如果 QuerySave 返回 true,代码应该继续调用 PostSave 函数——它甚至不会记录它正在启动 PostSave 函数。
更糟糕的是,在调用 PostSave 代码失败后,记录的下一件事是运行的 beforePageLoad 事件,这显然会重新加载页面,该页面没有最近的编辑,因此用户失去了所有他们输入的信息!
这一定是我在使用 XPages 时遇到过的最烦人的问题,因为我找不到成功的 QuerySave(甚至因为未填写必填字段而导致失败)会导致页面像这样刷新并丢失内容。请有人可以帮我指出正确的方向吗?