XPages:在客户端函数之后执行context.redirectToPage?

XPages:在客户端函数之后执行context.redirectToPage?,xpages,xpages-ssjs,Xpages,Xpages Ssjs,为什么context.redirectToPage在视图根事件而不是事件处理程序中执行时表现不同 当我尝试将xpages应用程序的语言设置为用户登录后保存在用户配置文件中的语言时,出现了这个问题。我在资源包中使用带有已翻译字符串的属性文件,并按如下方式检索字符串: <xp:text value="${langString['WELCOME_TEXT']}" /> 通过部分刷新发送的参数现在会触发执行context.redirectToPage的事件: <xp:this.bef

为什么context.redirectToPage在视图根事件而不是事件处理程序中执行时表现不同

当我尝试将xpages应用程序的语言设置为用户登录后保存在用户配置文件中的语言时,出现了这个问题。我在资源包中使用带有已翻译字符串的属性文件,并按如下方式检索字符串:

<xp:text value="${langString['WELCOME_TEXT']}" />
通过部分刷新发送的参数现在会触发执行context.redirectToPage的事件:

<xp:this.beforeRenderResponse><![CDATA[#{javascript:if (param.containsKey('execLogin') && param.get('execLogin').toString().equals('true')) {
    print("test");
    context.redirectToPage(context.getUrl().toSiteRelativeString(context),true);
}}]]></xp:this.beforeRenderResponse>

页面被刷新,“test”被打印出来,但我仍然看到旧的语言字符串。我必须再次手动刷新页面,以使新的用户语言生效

你知道如何以这种方式执行真正的完全刷新,或者以另一种方式更新从属性包检索到的字符串吗

提前谢谢。当做 莎拉

编辑

我现在有:

<xp:inputText id="cc_login_panel_login_username" styleClass="span2">
<xp:eventHandler event="onkeypress" submit="true" refreshMode="complete">
    <xp:this.script><![CDATA[if (thisEvent.keyCode!=13) {
        return false;
    } else {
        doLogin();
        return true;                                
    }]]></xp:this.script>
    <xp:this.action><![CDATA[#{javascript:context.redirectToPage(context.getUrl().toSiteRelativeString(context));}]]></xp:this.action>
</xp:eventHandler>


因为context.reloadPage()甚至没有让我登录(奇怪),我又开始使用redirectToPage了。服务器端事件在正确的时间触发一次*竖起大拇指*,但语言属性bevaviour仍然相同。

我认为这与使用$参数有关。这会告诉运行时在第一次在后端创建当前页面时检索语言文件。当用户进行刷新时,它实际上是在检索您正在查看的页面的保存版本

$仅在页面加载时设置,而#在每次部分刷新时设置

不过,我认为部分刷新根本不起作用。这将刷新计算字段。但是,需要完全刷新才能刷新包含属性文件的XPage部分。换句话说,您将刷新计算字段,但使用相同的属性文件

我想知道context.redirectToPage或context.reloadPage是否会以某种方式转到同一个页面,但带有缓存的属性文件

如果您总是希望返回同一页面,那么最好的选择是完全刷新而不是部分刷新。

我看到您在xp:this.action标记中为xp:eventHandler调用“context.RedirectPage(context.getURL().toSiteRelativeString(context))”

尝试使用xp:this.onComplete代替xp:this.action

根据操作的设计器工具提示,预期的返回是传递给导航处理程序的字符串。因此,在完成eventHandler事件组时,给出onComplete将执行重定向命令


感谢所有有用的答案,事实上所有答案都有效,问题是我对加载属性文件的时间有误解。在我的新语言被设置为sessionScope之前,它是在早期阶段加载的(sessionScope变量随后通过VariableResolver作为要加载的属性文件名称的一部分)

现在我使用双重完全刷新来加载新文件。登录功能成功终止时,将执行:

window.location.href = window.location.href + "?doRefresh=true";
在视图根元素中,我添加了以下事件:

<xp:this.beforeRenderResponse><![CDATA[#{javascript:
if (context.getUrlParameter("doRefresh")!=null&&context.getUrlParameter("doRefresh").equals("true")) {
    var url = context.getUrl().toSiteRelativeString(context);
    url = url.replace("?doRefresh=true","");
    context.redirectToPage(url);}
}]]></xp:this.beforeRenderResponse>


这不是一个非常复杂的解决方案,但至少它可以工作:-)

我刚刚尝试使用#检索语言字符串,但没有任何帮助。在执行context.redirectToPage时,字符串仍然没有更新,只有在手动刷新页面时才会发生这种情况。当用户登录时,是否有办法强制服务器重新呈现页面?这就是我认为context.redirectToPage正在做的。如何更改应用程序中的语言/区域设置?你为什么要在重定向中使用true参数呢?为什么不使用context.reloadPage呢?我刚刚添加了true参数,看看它是否改变了什么(没有)。我尝试使用context.reloadPage而不是redirectToPage,但它产生了相同的行为。实际上,我只是加载另一个属性文件来更改用户登录时的语言:
当我将#{getUserLanguage}放入xp:inputText或其他内容时,我可以看到它已更改为正确的语言,但是xpage不会从新文件中加载新字符串-只有在执行手动完全刷新时才会加载。我仍在试图理解“keyCode”的含义。。。为什么每次都要执行代码?您可以通过在客户端事件中返回false来停止执行服务器端事件。我不明白为什么这不起作用。在编写时,按钮按预期工作,但键触发的事件不起作用。这是正确的吗?如果没有,请回答我的第一个问题:如何更改区域设置?这是时间问题吗?如果打印出不同阶段/事件中的区域设置(在渲染响应之前等),会怎么样。另外,如果您只是将refereshid属性(也称为目标)留空,则可以对整个页面进行部分刷新。
<xp:this.beforeRenderResponse><![CDATA[#{javascript:
if (context.getUrlParameter("doRefresh")!=null&&context.getUrlParameter("doRefresh").equals("true")) {
    var url = context.getUrl().toSiteRelativeString(context);
    url = url.replace("?doRefresh=true","");
    context.redirectToPage(url);}
}]]></xp:this.beforeRenderResponse>