我在不同的自定义控件中有两个按钮,它们在它们的 onclick 事件中调用 context.redirectToPage()。在一种情况下,这会导致 HTTP 重定向(HTTP 状态为 302)到预期的 URL(即标头 Location = http://frontend.company.com/path/to/file.nsf/myXpages.xsp?documentId=C699C5D6E81721EA85257A2F00683319&openDocument) . 在另一个例子中,它返回一个像这样的标签:
<script>window.location.href='http://backend.company.com:81/path/to/file.nsf/myXpage.xsp?documentId=C699C5D6E81721EA85257A2F00683319&openDocument'</script>
两个实例都有 submit=true、refresh=complete 和 immediate=true。两者都有正确执行的客户端脚本和在重定向调用之前执行的几行 SSJS。我能想到的唯一可能导致这种情况的区别是返回脚本的按钮位于 (xe:dialog) 中。
你们中的精明人士会注意到为什么这对我来说是个问题,因为我们的 Domino 服务器位于反向代理后面。普通人无法直接访问 Domino,因此脚本标记中生成的 URL 将不起作用。
有没有人知道如何从第二个按钮获得 302 重定向的首选行为,甚至是让它使用正确 URL 的方法?或者甚至阐明为什么行为会有所不同?
谢谢,
富有的
编辑:为 context.redirect() 生成脚本标记的按钮代码:
<xp:button
id="errorReloadButton"
value="Reload Page">
<xp:this.rendered><![CDATA[#{javascript:whichButton == "reload"}]]></xp:this.rendered>
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
immediate="true">
<xp:this.action>
<xp:actionGroup>
<xp:executeScript>
<xp:this.script><! [CDATA[#{javascript:sessionScope.remove("errors");
var c = getComponent("errorDialog")
c.hide();
var redirectTarget = view.getPageName() + '?documentId=' + compositeData.docID + '&openDocument';
context.redirectToPage(redirectTarget,true);
}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
</xp:this.action>
<xp:this.script>
<xp:executeClientScript>
<xp:this.script><![CDATA[setClean("#{javascript:compositeData.docID}");
XSP._setDirty(false,"");]]></xp:this.script>
</xp:executeClientScript>
</xp:this.script>
</xp:eventHandler>
</xp:button>
编辑 2:正确强制 302 重定向的按钮源:
<xp:button
id="cancelButton"
value="Cancel"
rendered="#{javascript:compositeData.documentDataSource.isEditable()}">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete"
onError="handleError(arguments[0],arguments[1])"
immediate="true">
<xp:this.action>
<xp:actionGroup>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:var xdoc:NotesXspDocument = compositeData.documentDataSource;
if(xdoc.isNewNote()){
return;
}
var doc:NotesDocument = xdoc.getDocument(false);
/* more code here, not relevant to this */
var docid = doc.getUniversalID();
context.redirectToPage(view.getPageName() + '?documentId=' + docid + '&openDocument')}]]></xp:this.script>
</xp:executeScript>
</xp:actionGroup>
</xp:this.action>
<xp:this.script>
<xp:executeClientScript>
<xp:this.script><![CDATA[setClean("#{javascript:docId(compositeData.documentDataSource)}");
if(#{javascript:compositeData.documentDataSource.isNewNote()}){
popPageStack();
return false;
}]]></xp:this.script>
</xp:executeClientScript>
</xp:this.script>
</xp:eventHandler>
</xp:button>