使用 PageParameters 时将信息消息传递到 Wicket 页面

Posted

技术标签:

【中文标题】使用 PageParameters 时将信息消息传递到 Wicket 页面【英文标题】:Passing info message to a Wicket page while using PageParameters 【发布时间】:2012-04-28 16:40:15 【问题描述】:

Wicket 是否允许在 PageParameters 对象中传递以下两种参数?好像没有?

accountId 显示在 URL (/account/<ID>) 中 infoMessage 参数显示在(书签)URL 中

我目前正在对相关页面使用 IndexedHybridUrlCodingStrategy,只需尝试参数“0”和“infoMessage”就会出现此异常:

WicketMessage:并非所有参数都经过编码。确保所有 参数名称是从零开始的连续顺序的整数。 当前参数名称为:[0, infoMessage]

如果我将“infoMessage”参数名称更改为“1”,它会起作用,但会产生一个丑陋的 URL(在本例中类似于 /account/42/Tosite%20108207%20tallennettiin.5),这不是我想要的。


现在,显而易见的答案可能是 infoMessage 不应该在 PageParameters 中。但问题是,我尝试将其添加为普通的构造函数参数,如下所示:

public AccountPage(PageParameters parameters, String infoMessage) 
    // ...

但是这种方法在一个重要的用例中失败了。删除与帐户相关的持久“记录”对象后,以下内容正确加载 AccountPage(删除的记录仍然可见)。此代码在 AjaxFallbackLink 的 onClick() 中执行。

setResponsePage(new AccountPage(AccountPage.pageParameters(account), message));

另一方面,我原来的做法...

setResponsePage(AccountPage.class, AccountPage.pageParameters(account));

... 工作正常,因为它以某种方式“更彻底”地加载 AccountPage,但是,我不知道如何干净地传递 infoMessage 参数。

(上面的AccountPage.pageParameters() 是一个简单的静态实用程序,用于创建具有“0” = 帐户ID 的适当PageParameters。AccountPage 构造函数始终使用ID 从持久性中加载帐户。)

有什么想法吗?也许使用 AjaxFallbackLink 会部分导致问题?

使用 Wicket 1.4。

【问题讨论】:

【参考方案1】:

根据我在您的问题中看到的内容,您尝试呈现可收藏的页面并向用户显示反馈消息(很可能在 FeedbackPanel 中),但您不希望该消息成为网址。

您要做的是告诉Session您有一条信息性消息,并让反馈面板处理该消息。

@Override void onSubmit() 
    ... save object ...
    getSession().info("Object ... has been saved");
    setResponsePage(ObjectPage.class, new PageParameters("id="+object.getId()));

在这种情况下,您告诉 Wicket 在会话中临时存储一条消息,直到它被反馈面板呈现。这个成语也被称为“闪信”。

您不能同时使用PageParameters 和另一个参数作为构造函数参数,因为当请求页面时,Wicket 无法使用这样的构造函数创建您的页面实例。 Wicket 只知道如何实例化带有默认构造函数的页面或带有PageParameters 参数的页面。

【讨论】:

是的,这正是我想要做的;谢谢!很高兴使用getSession().info() 存储的消息被目标页面的反馈面板自动拾取。

以上是关于使用 PageParameters 时将信息消息传递到 Wicket 页面的主要内容,如果未能解决你的问题,请参考以下文章

Vue 如何接受IOS传过来的window数据

nodemon :作为必需模块使用时将参数传递给可执行文件

使用它时将参数传递给perl包

异步初始化时将参数传递给python类

sh 在关机时将日志传送到s3

在编译时将参数传递给主函数