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

时间:2012-04-17 10:35:46

标签: java wicket friendly-url

Wicket是否允许在PageParameters对象中传递以下两种参数?显然不是吗?

  • accountId 显示在网址(/account/<ID>
  • infoMessage参数显示在(可收藏的)网址

我目前正在使用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.FountPage构造函数始终使用ID从持久性加载帐户。)

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

使用Wicket 1.4。

1 个答案:

答案 0 :(得分:5)

从我在您的问题中看到的,您尝试呈现可收藏的页面并向用户显示反馈消息(最有可能在FeedbackPanel中),但您不希望该消息成为其中的一部分的URL。

您要做的是告诉Session您有信息性消息,并让反馈小组处理该消息。

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

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

您不能同时使用PageParameters和其他参数作为构造函数参数,因为在请求页面时,Wicket无法使用此类构造函数创建页面实例。 Wicket只知道如何使用默认构造函数或具有PageParameters参数的页面实例化页面。