绑定枚举以在Play中形成<select>元素!框架2.1 </select>

时间:2013-07-31 18:37:27

标签: java playframework playframework-2.0

我正在尝试找出绑定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>

3 个答案:

答案 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);
        }
    }};