我对Play Framework很陌生,所以我希望这是可以理解的。
如何告诉play将表单元素映射到Form类的Object字段?
我有一个表单,其中包含从我的ORM中选择对象名称的下拉列表。下拉项的值是ORM对象的ID字段。
Java端的表单对象有一个带有ORM对象类型的字段,一个带字符串并将其转换为对象的setter,但是在表单提交时我只得到一个表单错误“Invalid Value”表示翻译根本没有发生。
我的模板有一个表单组件:
@helper.select(
createAccountForm("industry"),
helper.options(industries)
)
模板构造函数中industries
的定义位置为:industries: Map[String, String]
并由用户可读名称的ID字符串组成。
我的控制器定义了类:
public static class CreateAccountForm {
public String name;
public Industry industry;
public void setIndustry(String industryId) {
this.industry = Industry.getIndustry(Integer.parseInt(industryId));
}
}
编辑:我在班上做了setter,因为this answer表示这样做,但是没有用。
EDIT2: 事实证明,setter方法完全没有办法实现这一目标。在试着让注释工作之后我有点头疼,我注意到了Formatters.SimpleFormatter并尝试了这一点。虽然我不明白为什么围绕它的额外块是必要的,但它确实有效。
Global.java:
public class Global extends GlobalSettings {
// Yes, this block is necessary; no, I don't know why.
{
Formatters.register(Industry.class, new Formatters.SimpleFormatter<Industry>() {
@Override
public Industry parse(String industryId, Locale locale) throws ParseException {
return Industry.getIndustry(Integer.parseInt(industryId));
}
@Override
public String print(Industry industry, Locale locale) {
return industry.name;
}
});
}
}
答案 0 :(得分:0)
Play使用时将表单绑定到对象,如文档中所述:https://github.com/playframework/Play20/wiki/JavaForms
所以你的控制器应该是这样的:
Form<models.Task> taskForm = form(models.Task.class).bindFromRequest();
if (taskForm.hasErrors()) {
return badRequest(views.html.tasks.create.render(taskForm));
}
Task task = taskForm.get();
任务对象可以有Priority
个选项列表。你可以在形式(视图)中使用它,如:
@select(editForm("priority.id"), options(Task.priorities), 'class -> "input-xlarge", '_label -> Messages("priority"), '_default -> Messages("make.choice"), 'showConstraints -> false, '_help -> "")
请注意,我正在使用priorities.id
告诉播放所选的值应按优先级ID绑定。当然要获得任务的优先级:
public static Map<String, String> priorities() {
LinkedHashMap<String, String> prioritiesList = new LinkedHashMap<String, String>();
List<Priority> priorities = Priority.getPrioritiesForTask("task");
for (Priority orderPrio : priorities) {
prioritiesList.put(orderPrio.getId().toString(), orderPrio.getDescription());
}
return prioritiesList;
}