在浏览器中提交 POST 后重新加载页面
Reloading the page after submitting POST in a browser
我有一个使用 JQuery 对话框的 XPage,其中我有一个按钮(在一个普通的 div 里面,没有 JQuery),它创建了一个新的后端 "part" 当触发。另一方面,在客户端有验证(检查所有字段是否为空)。如果客户端验证成功,服务器端将执行后端代码并创建新的 "part"。我遇到的问题是当创建新部件时,如果我按下 F5 按钮,浏览器会让我重复请求。如果用户单击 "Yes",则会创建新部分(与表单中最后一个部分的副本)。我该如何预防?
<xp:button id="save_part_btn"
value="+Add part" style="float:right;">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
var estdoc:NotesDocument=database.getDocumentByUNID(doc_source.getDocument().getParentDocumentUNID())
var estPartdoc:NotesDocument=estdoc.getParentDatabase().createDocument()
estPartdoc.replaceItemValue('Form','Estimate_Cost_Part')
estPartdoc.replaceItemValue('Predoc',estdoc.getUniversalID())
estPartdoc.replaceItemValue('$OSN_IsSaved','1')
estPartdoc.replaceItemValue('Title', getComponent('input_part_title').getValue())
estPartdoc.replaceItemValue('TSNB_Title',getComponent('input_tsnb_title').getValue())
estPartdoc.replaceItemValue('TSNB_All',getComponent('input_tsnb_all').getValue())
estPartdoc.replaceItemValue('TSNB_Build_Work',getComponent('input_tsnb_build_work').getValue())
estPartdoc.replaceItemValue('TSNB_Equipment',getComponent('input_tsnb_equipment').getValue())
estPartdoc.replaceItemValue('TSNB_Other_Costs',getComponent('input_tsnb_other_costs').getValue())
estPartdoc.replaceItemValue('TSNB_PIR',getComponent('input_tsnb_pir').getValue())
estPartdoc.replaceItemValue('TSNB_Return',getComponent('input_tsnb_return').getValue())
estPartdoc.replaceItemValue('Current_Title',getComponent('input_current_title').getValue())
estPartdoc.replaceItemValue('Current_All',getComponent('input_current_all').getValue())
estPartdoc.replaceItemValue('Current_Build_Work',getComponent('input_current_build_work').getValue())
estPartdoc.replaceItemValue('Current_Equipment',getComponent('input_current_equipment').getValue())
estPartdoc.replaceItemValue('Current_Other_Costs',getComponent('input_current_other_costs').getValue())
estPartdoc.replaceItemValue('Current_PIR',getComponent('input_current_pir').getValue())
estPartdoc.replaceItemValue('Current_NDS',getComponent('input_current_nds').getValue())
estPartdoc.replaceItemValue('Current_Return',getComponent('input_current_return').getValue())
//var estPartOdoc=new OsnovaUI_document(estPartdoc)
//estPartOdoc.makeDependent(estdoc)
print('new part created with id:'+estPartdoc)
estPartdoc.makeResponse(estdoc)
estPartdoc.save()
var ag:NotesAgent=database.getAgent('User_CalculateEstimateCost')
ag.runOnServer(doc_source.getDocument().getNoteID())
}]]></xp:this.action>
服务器端代码,没什么特别的。
On submit = "true"
I return 验证成功则为真,失败则为假
您需要实施 POST-Redirect-GET 模式。这是一个示例(自 2010 年起):XPages: Avoid saving duplicate documents on browser refresh.
关键部分是在服务器端逻辑的末尾包含重定向。这是一个简单的例子:
context.redirectToPage(view.getPageName());
在你的情况下,重定向需要重新打开文档,所以这样做:
context.redirectToPage(view.getPageName()+ "?OpenXpage&documentId="+doc_source.getNoteID());
我有一个使用 JQuery 对话框的 XPage,其中我有一个按钮(在一个普通的 div 里面,没有 JQuery),它创建了一个新的后端 "part" 当触发。另一方面,在客户端有验证(检查所有字段是否为空)。如果客户端验证成功,服务器端将执行后端代码并创建新的 "part"。我遇到的问题是当创建新部件时,如果我按下 F5 按钮,浏览器会让我重复请求。如果用户单击 "Yes",则会创建新部分(与表单中最后一个部分的副本)。我该如何预防?
<xp:button id="save_part_btn"
value="+Add part" style="float:right;">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
var estdoc:NotesDocument=database.getDocumentByUNID(doc_source.getDocument().getParentDocumentUNID())
var estPartdoc:NotesDocument=estdoc.getParentDatabase().createDocument()
estPartdoc.replaceItemValue('Form','Estimate_Cost_Part')
estPartdoc.replaceItemValue('Predoc',estdoc.getUniversalID())
estPartdoc.replaceItemValue('$OSN_IsSaved','1')
estPartdoc.replaceItemValue('Title', getComponent('input_part_title').getValue())
estPartdoc.replaceItemValue('TSNB_Title',getComponent('input_tsnb_title').getValue())
estPartdoc.replaceItemValue('TSNB_All',getComponent('input_tsnb_all').getValue())
estPartdoc.replaceItemValue('TSNB_Build_Work',getComponent('input_tsnb_build_work').getValue())
estPartdoc.replaceItemValue('TSNB_Equipment',getComponent('input_tsnb_equipment').getValue())
estPartdoc.replaceItemValue('TSNB_Other_Costs',getComponent('input_tsnb_other_costs').getValue())
estPartdoc.replaceItemValue('TSNB_PIR',getComponent('input_tsnb_pir').getValue())
estPartdoc.replaceItemValue('TSNB_Return',getComponent('input_tsnb_return').getValue())
estPartdoc.replaceItemValue('Current_Title',getComponent('input_current_title').getValue())
estPartdoc.replaceItemValue('Current_All',getComponent('input_current_all').getValue())
estPartdoc.replaceItemValue('Current_Build_Work',getComponent('input_current_build_work').getValue())
estPartdoc.replaceItemValue('Current_Equipment',getComponent('input_current_equipment').getValue())
estPartdoc.replaceItemValue('Current_Other_Costs',getComponent('input_current_other_costs').getValue())
estPartdoc.replaceItemValue('Current_PIR',getComponent('input_current_pir').getValue())
estPartdoc.replaceItemValue('Current_NDS',getComponent('input_current_nds').getValue())
estPartdoc.replaceItemValue('Current_Return',getComponent('input_current_return').getValue())
//var estPartOdoc=new OsnovaUI_document(estPartdoc)
//estPartOdoc.makeDependent(estdoc)
print('new part created with id:'+estPartdoc)
estPartdoc.makeResponse(estdoc)
estPartdoc.save()
var ag:NotesAgent=database.getAgent('User_CalculateEstimateCost')
ag.runOnServer(doc_source.getDocument().getNoteID())
}]]></xp:this.action>
服务器端代码,没什么特别的。
On submit = "true"
I return 验证成功则为真,失败则为假
您需要实施 POST-Redirect-GET 模式。这是一个示例(自 2010 年起):XPages: Avoid saving duplicate documents on browser refresh.
关键部分是在服务器端逻辑的末尾包含重定向。这是一个简单的例子:
context.redirectToPage(view.getPageName());
在你的情况下,重定向需要重新打开文档,所以这样做:
context.redirectToPage(view.getPageName()+ "?OpenXpage&documentId="+doc_source.getNoteID());