在WICKET中显示错误时不添加所有组件

时间:2011-01-20 17:26:45

标签: components wicket

我有一个只需一个参数的页面。如果没有传递这个参数,那么我想显示一条错误消息(“请传递参数'blah”),它将显示在FeedBackPanel中并进行保释。但是,如果我没有附加所有组件,那么wicket会出错,将客户端重定向到Wicket的错误页面。

有没有办法显示错误消息而不是将所有项目添加到页面?一些项目是ListViews等......

3 个答案:

答案 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勋爵走在正确的轨道上。

我偷了这个例子:http://apache-wicket.1842946.n4.nabble.com/Feedback-message-does-not-show-in-new-WebPage-td2993413.html

HTML片段

<div wicket:id="fbpnlFeedbackPanel"/>

Java片段

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)使用该面板中提供的文本/模型。

相关问题