Java 将枚举绑定到窗体<;选择>;游戏中的元素!框架2.1

Java 将枚举绑定到窗体<;选择>;游戏中的元素!框架2.1,java,playframework,playframework-2.0,Java,Playframework,Playframework 2.0,我正在尝试找出最佳做法,将enum绑定到表单下拉列表!2.0 这是我的枚举: public enum ContactType { CLIENT(1), CONTRACTOR(2), SUPPLIER(3); public final int id; ContactType(int id) { this.id = id; } } 在我看来,以下是我希望得到的结果: <select name="contactType">

我正在尝试找出最佳做法,将
enum
绑定到表单下拉列表
!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>

客户
承包商
供应商

模板中类似的内容应该可以工作:

<select name="contactType">
    @for(cType <- ContactType.values()){
        <option value="@cType.id">@cType.name()</option>
    }
</select>


@对于(cType假设您将选择放入HTML表单中,我们商店的做法是向Java枚举添加一个映射,然后使用框架提供的选择表单帮助器:

枚举:

公共枚举联系人类型{
客户(1),
承包商(2),
供应商(3);
公共最终int id;
联系人类型(int id){
this.id=id;
}
公共静态映射选项(){
LinkedHashMap VAL=新LinkedHashMap();
对于(ContactTypecType:ContactType.values()){
put(cType.id(),cType.name());
}
返回VAL;
}
}
视图:

@(contactForm:Form[models.Contact])
导入助手_
@helper.form(routes.Contact.formHandlerMethod()){
@* 
*此处contactForm(“contactType”)假设您要映射
*ContactType选择到Contact类中的字段(我们已经
*包装在play.data.Form中,以便接触的字段
*我们表格中的输入
*@
@选择(contactForm(“contactType”)、选项(contactType.options())
}
使用此设计模式,您可以利用play.data.Form类中的helper函数来验证和绑定联系人控制器中的表单数据,并且您可以从视图中的逻辑更少以及将逻辑放在易于在整个应用程序中重复使用的位置中获益


另一方面,如果您自己使用select并以其他方式驱动操作,那么Aerus的回答可能是最直接的方式。

编辑:表单不应包含枚举的所有类路径,只应包含枚举名称。因此,在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;
}
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 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);
        }
    }};
公共枚举联系人类型{
管理员、支持、经理、开发人员、设计师,无任何信息;
}
公共静态最终映射类型=新HashMap()
{{
for(ContactType值:ContactType.values()){
字符串名称=value.name().toLowerCase();
name=Character.toUpperCase(name.charAt(0))+name.substring(1.replaceAll(““,”);
put(ContactType.class.getName()+“+”值.name(),名称);
}
}};

@ainla不客气。当您的编辑被拒绝时,我手动添加了它们,尽管我认为区分
类型很重要(保留)和
cType
,谢谢你指出这一点!@Ailla,伙计们,我们如何创建一个适用于任何枚举类型的视图?谢谢!这也是一个非常优雅的解决方案。保持视图代码整洁。解决方案不错,但缺少静态修饰符:public static Map options()很好的回答,@cosmolev。我没有代表批准你的编辑,但我会自己编辑。我会回答自己,并分享我的结论,以防somobody遇到同样的问题:默认情况下,使用枚举名绑定。我的post方法是错误的,因为它将完整路径发送到枚举“models.constants.ContactType.SUPPORT”。正确的做法是在这种情况下只发送支持。您好,回答得很好!我唯一的问题是,当我传入一个预填充的表单时,它似乎没有检查任何单选按钮。您是否遇到过同样的问题?这取决于您在视图中如何实现单选按钮行为。在我的情况下,我不会使用Play提供的帮助程序,因为我我对视图使用引导,所以对于检查部分,我使用代码
@if(field.value.getOrElse(“”.equals(“true”){checked}
我也没有使用帮助程序,我使用了帮助程序中的代码,并将其更新为我自己的代码,因为我也使用了引导程序,但我无法使其正常工作。您介意共享单选按钮代码吗?这就是我所拥有的-
@if(value==Some(v._1)){checked=“checked”}
其中,v是返回的映射中的一对。
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; 
}
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);
        }
    }};