2

我已经构建了一个检票口组件,其中包含输入/标签和更改表示的方法(必需、启用等)。组件渲染得很好,但是当表单提交时,我只看到 1 个表单参数“input”,它是最后一个 InputRow 组件。

输入行.html

<html xmlns:wicket="http://wicket.apache.org">
<head>
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
    <wicket:panel>
        <label wicket:id="label">abc: <span class="req">*</span></label>
        <span class="input">
            <input wicket:id="input" type="text" id="name"></input>
        </span>
        <span wicket:id="input_feedback"></span>            
    </wicket:panel>

</body>
</html>

输入行.java

package com.wicket;

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;

public class InputRow extends Panel{

    @SuppressWarnings("unused")
    private String id;

    public InputRow(String id, String label) {
        super(id);

        this.id = id;

         Label memberIdLabel = new Label("label",label);
         memberIdLabel.setEscapeModelStrings(false)
            .add(new AttributeAppender("for", new Model<String>(id),""));
         add(memberIdLabel);

        TextField<String> name = new TextField<String>("input");
        name.setType(String.class)
            .setMarkupId(id)
            .setOutputMarkupId(true);
        add(name);

        add(new Label("input_feedback",""));

    }

    public InputRow disable()
    {
        get("input")
            .setEnabled(false)
            .add(new AttributeAppender("class", new Model<String>("disabled"),""));
        get("label")
            .add(new AttributeAppender("class", new Model<String>("disabled"),""));
        return this;
    }

    public InputRow required()
    {
        Model model = (Model)get("label").getInnermostModel();
        StringBuffer label = new StringBuffer((String)model.getObject());
        label.append(" <span class=\"req\">*</span>");
        model.setObject(label);

        ((TextField)get("input")).setRequired(true);
        return this;
    }

    @Override
    protected void onBeforeRender() {
        super.onBeforeRender();
        Label feedback = (Label)get("input_feedback");

        if (get("input").getFeedbackMessage() != null)
        {
            feedback.setDefaultModel(new Model<String>("Required"));
        }
    }


}

添加到表单组件

add(new InputRow("name","Name:").required());

编辑 我没有设置 ListView 或中继器,因为我知道在构建时要添加到表单中的行/字段。

4

3 回答 3

1

提交的表单参数不止一个。提交的名称为name:input, name2:input, ...

但正如 Nicktar 在评论中建议的那样,您应该使用模型将表单组件的值绑定到您的实体对象。您必须在构造函数中接受 aIModel并在 的构造函数中使用它TextField

您尝试做的更好的方法是编写一个Behavior为您的 FormComponent 添加装饰标记的方法。这样,它不仅适用于简单的文本输入字段,而且您可以完全自定义FormComponents.

它可能看起来像这样:

public class FormComponentBehavior extends Behavior {

    @Override
    public void bind(Component component) {
        if (!(component instanceof FormComponent)) {
            throw new IllegalArgumentException();
        }
    }

    @Override
    public void beforeRender(Component component) {
        FormComponent<?> fc = (FormComponent<?>) component;
        Response r = component.getResponse();
        r.write("<label" + (fc.isRequired() ? " class='required'" : "") + ">");
        r.write(fc.getLabel().getObject());
        r.write("</label>");
        r.write("<span class='input'>");
    }

    @Override
    public void afterRender(Component component) {
        component.getResponse().write("</span>");
        // if feedback errors write them to markup...
    }
}

然后您必须将此行为添加到您的 FormComponent 实例中。

于 2012-08-24T14:50:22.583 回答
1

您的 InputFields 缺少他们的模型。这样,wicket 不知道在哪里存储表单数据。如果您将模型添加到字段中,它们将自动填充。

于 2012-08-25T11:35:16.433 回答
0

也许您的表单的问题是您的输入文本字段具有所有相同的 id。尝试使用属性 'name' 而不是 'id'

于 2012-08-24T14:59:13.237 回答