【问题标题】:Dynamic size of form in Play framework 2.7 (Java)Play framework 2.7(Java)中表单的动态大小
【发布时间】:2019-12-13 00:31:12
【问题描述】:

我想使用 Java 中的 Play framework 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&lt;InformationData&gt; form; 将用作我的视图的参数(Twirl 模板)。

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

编辑

我尝试使用循环的当前索引来修改我所有字段的名称(即:name0 然后name1 等等),它停止与我的字段混淆,因为它们没有相同的名称,但我的InformationData 无法验证,因为它无法识别我的字段名称。

是否有可能通过使用 HashMap 或其他东西来理解 name0name1 应该被视为(不同的)name

【问题讨论】:

    标签: java playframework twirl


    【解决方案1】:

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

    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
    

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

    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 动态创建你的输入字段。

    【讨论】:

    • 您在视图参数中给出的forms 是什么?
    • 这只是一个错字,它是包名,如果你的表单在包“forms”中,你应该在scala中声明它们play.data.Form[packageName.InformationData]
    • 我有这个错误:value getInformations is not a member of play.data.Form[data.InformationData]
    • 我编辑了我的问题,向您展示我的部分观点。在@helper 中,"fieldName" 值应该等于信息属性的名称(名称、名字等),这要归功于另一个参数,我认为现在不相关。但是由于我的列表是空的,所以我有一个错误No value present
    • 如果你不知道输入字段的数量,在scala部分之前,你必须使用一些javascript来动态构建你的表单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多