我想使用Java中的Play框架2.7创建一个表单应用程序,我想在一定数量的时间内创建表单的所有字段,这在创建它之前是未知的。

这是我的模型之一:

public class Information {

    public String clientType;
    public String companyName;
    public String name;
    public String firstName;
    public String addressNumber;
    public String apartmentType;

    public Information(String companyName, String name, String firstName, String addressNumber, String clientType,
            String apartmentType) {
        this.clientType = clientType;
        this.companyName = companyName;
        this.name = name;
        this.firstName = firstName;
        this.addressNumber = addressNumber;
        this.apartmentType = apartmentType;
    }
}


在这里,我的数据之一:

public class InformationData {

    @Constraints.Required
    private String clientType;

    @Constraints.Required
    private String companyName;

    @Constraints.Required
    private String name;

    @Constraints.Required
    private String firstName;

    @Constraints.Required
    private String addressNumber;

    @Constraints.Required
    private String apartmentType;

    public InformationData() {
    }

    // getters and setters
}


这是我观点的一部分:

@(informationForm: play.data.Form[data.InformationData])
<h1>Informations</h1>

@helper.form(routes.InformationController.validationInformations) {
        @helper.CSRF.formField
        @helper.inputText(
                informationForm("fieldName"),
                Symbol("_help") -> "",
                Symbol("_error") -> informationForm("fieldName").
                   error.map(_.withMessage("ERROR"))
        )
        <button type="submit">Submit</button>
}


在我的控制器中,我具有此属性
private final Form<InformationData> form;将用作我的视图(旋转模板)的参数。

我试图将此属性转换为java.util.List,并在我的视图中使用此List上的@for循环(在我的视图中成为Scala Seq),但表单的验证不正确:它考虑了每个(例如)name字段与同一字段相同,因此在验证期间,它只会用第一个字段的值填充每个name字段的值(即使第一个字段为空,而另一个也不为空)。

编辑

我试图用循环的当前索引修改我所有字段的名称(即:name0然后name1依此类推),由于它们的名称不同,它不再使我的字段混乱,但是我InformationData无法验证,因为它无法识别我的字段名称。

是否可以通过使用HashMap或其他方式理解name0name1应该被视为(不同)name

最佳答案

如果您需要信息列表,只需使用以下信息列表构建表单:

public class InformationData {

    @Constraints.Required
    private List<Information> informations;

    // setter and getter
}


在您的网页中,您可以使用以下列表:

@(informationForm: play.data.Form[InformationData])

//your html

@for(information<-informationForm.get().getInformations()){
    <p>@information.getName</p>
    <p>@information.getCompanyName</p>
    //all your stuff to print
}

//your html


请记住,要检索字段,应先“获取()”表单,然后才能访问其中的方法。

informationForm.get().getInformations()


要检查列表的长度,只需调用“ length”方法。

informationForm.get().getInformations.length




对于表单部分,要以html格式构建,您必须提供一个有效名称来构建值列表,例如

@helper.form(routes.InformationController.validationInformations) {
        @helper.CSRF.formField

        <input type="text" name="name[0]" value="">
        <input type="text" name="companyName[0]" value="">
        .....
        <input type="text" name="name[N]" value="">
        <input type="text" name="companyName[N]" value="">

        <button type="submit">Submit</button>
}


如果您无法事先使用scala打印它,则应使用一些javascript动态创建输入字段。

10-06 03:06