我想使用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或其他方式理解
name0
和name1
应该被视为(不同)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动态创建输入字段。