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。
答案 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
参数的页面实例化页面。