我正在尝试找出绑定enum
以在Play中形成下拉列表<select>
的最佳做法! 2.0
这是我的枚举:
public enum ContactType {
CLIENT(1),
CONTRACTOR(2),
SUPPLIER(3);
public final int id;
ContactType(int id) {
this.id = id;
}
}
以下是我希望得到的结果:
<select name="contactType">
<option value="1">CLIENT</option>
<option value="2">CONTRACTOR</option>
<option value="3">SUPPLIER</option>
</select>
答案 0 :(得分:17)
假设您将select放入HTML表单,我们在商店中的方式是在Java枚举中添加Map,然后使用框架提供的select form helper:
枚举:
public enum ContactType {
CLIENT(1),
CONTRACTOR(2),
SUPPLIER(3);
public final int id;
ContactType(int id) {
this.id = id;
}
public static Map<String, String> options(){
LinkedHashMap<String, String> vals = new LinkedHashMap<String, String>();
for (ContactTypecType cType: ContactType.values()) {
vals.put(cType.id(), cType.name());
}
return vals;
}
}
视图:
@(contactForm: Form[models.Contact])
import helper._
<html><head></head><body>
@helper.form(routes.Contact.formHandlerMethod()){
@*
* Here contactForm("contactType") assumes that you want to map the
* ContactType selected to a field in a Contact class (which we've
* wrapped in play.data.Form<T> so that the fields in Contact become
* inputs in our form
*@
@select(contactForm("contactType"), options(ContactType.options())
}
</body></html>
使用此设计模式,您可以利用play.data.Form类中的辅助函数来验证和绑定Contact Controller中的表单数据,并且您可以从视图中的逻辑更少中获益,并将逻辑放在一个位置它可以在整个应用程序中轻松重复使用。
另一方面,如果您正在使用自己的选择和其他方式的驾驶操作,那么Aerus的回答可能是最直接的方式。
答案 1 :(得分:8)
模板中的这类内容应该有效:
<select name="contactType">
@for(cType <- ContactType.values()){
<option value="@cType.id">@cType.name()</option>
}
</select>
注意:最好使用toString()
代替name()
。如果您在枚举中覆盖toString()
,则可以返回承包商而不是承包商。
注意2:如果您的枚举不在models
包中,则需要在其前面添加正确的包名称,例如:@for(cType <- com.my_company.enums.ContactType)
答案 2 :(得分:4)
编辑:表单不应包含枚举的所有类路径,只包含枚举名称。所以在ContactType类中,put方法必须替换为:
put(value.name(),name);
我无法将枚举绑定到类中。在控制器中,我有类似的东西:
public Result saveUser() {
Form<User> userForm = form(User.class).bindFromRequest();
if(userForm.hasErrors()) {
return badRequest(createUser.render(userForm));
}
User user=userForm.get();
user.save();
Logger.info(user.contacts.toString());
flash("success", "User " + userForm.get().identity + " has been created");
return GO_ADMIN;
}
一直在给我回复“error.invalid”。 POST响应如下:
identity=asas&
status=1&
contacts[0].name=fasddf&
contacts[0].prename=afadfs&
contacts[0].email=ffdf@aa.com&
contacts[0].contactType=models.constats.ContactType.MANAGER
为了获得更多信息,我在这里提供了用户和联系方式
用户强>
public class User extends Model{
@Constraints.Required(message = "Field is required")
public String identity;
public Integer status;
@Valid
public List<Contact> contacts;
}
与强>
public class Contact extends Generic{
@Constraints.Required(message = "Field is required")
public String name;
@Constraints.Required(message = "Field is required")
public String prename;
@Constraints.Required(message = "Field is required")
@Constraints.Email
public String email;
public ContactType contactType;
}
<强> ContactType 强>
public enum ContactType {
ADMIN,SUPPORT,MANAGER,DEVELOPER,DESIGNER,NO_INFORMATION;
}
public static final Map<String,Object> types=new HashMap<String,Object>()
{{
for (ContactType value : ContactType.values()) {
String name=value.name().toLowerCase();
name=Character.toUpperCase(name.charAt(0)) + name.substring(1).replaceAll("_", " ");
put(ContactType.class.getName() + "."+ value.name(),name);
}
}};