我有一个只需一个参数的页面。如果没有传递这个参数,那么我想显示一条错误消息(“请传递参数'blah”),它将显示在FeedBackPanel中并进行保释。但是,如果我没有附加所有组件,那么wicket会出错,将客户端重定向到Wicket的错误页面。
有没有办法显示错误消息而不是将所有项目添加到页面?一些项目是ListViews等......
答案 0 :(得分:3)
如果一个容器不可见,则不会验证结构的一致性(匹配儿童的ID)。因此,只需将内容包装在某个容器中,如果未传递参数,则调用container.setVisible(false)。然后您可以立即返回,不添加其子女,Wicket不会抱怨:
HomePage.java
public class HomePage extends WebPage {
public HomePage(PageParameters pageParameters) {
super(pageParameters);
add(new FeedbackPanel("feedback"));
WebMarkupContainer container = new WebMarkupContainer("container");
add(container);
if (getPageParameters().getString("id") == null) {
error("Where's my 'id' argument?!?");
container.setVisible(false);
//you can return here, Wicket won't complain about not finding the form.
return;
}
Form form = new Form("form");
form.add(new TextField("field1", new Model()));
form.add(new TextField("field2", new Model()));
container.add(form);
}
}
HomePage.html
<html xmlns:wicket="http://wicket.apache.org">
<body>
<ul wicket:id="feedback"></ul>
<div wicket:id="container">
<form wicket:id="form">
<input wicket:id="field1">
<input wicket:id="field2">
</form>
</div>
</body>
</html>
答案 1 :(得分:0)
最简单的解决方案是完全显示不同的页面。
如果失败,您可以使用Panel
将所有可选组件放入。
这样的事情:
public MyPage( String param ) {
if ( param != null ) {
add( new MyPanel( "content", param ) );
} else {
add( new Label( "content", "" );
}
}
你的HTML将是
<html>
<body>
!-- Feedback panel goes here -->
...
<!-- Content panel goes here -->
<wicket:container wicket:id="content"/>
</body>
</html>
你也可以使用`Fragment
,但我不推荐它,它不会给你很好的代码。
答案 2 :(得分:0)
我认为Torgamus勋爵走在正确的轨道上。
<div wicket:id="fbpnlFeedbackPanel"/>
public MyPage(boolean failed)
{
super();
FeedbackPanel fbpnlFeedbackPanel = new FeedbackPanel("fbpnlFeedbackPanel");
add(fbpnlFeedbackPanel);
if (failed)
{
// MySession extends WebSession
MySession ssnSession = (MySession)getSession();
ssnSession.error("[Error text to put in FeedbackPanel] or use a model");
...
}
Form<?> frmForm = new Form<?>("frmForm")
{
...
}
...
}
调用session.error()的事实为页面添加了足够的东西,以便知道(a)显示反馈面板和(b)使用该面板中提供的文本/模型。