从控制器中的选择器(@Select)中获取选定值。 Java Play框架

时间:2013-11-08 11:52:07

标签: java model-view-controller playframework playframework-2.0

我正在尝试在我的控制器中获取一个选定的值但无法使其工作。

在我看来,我有一个表格:

@(infoObjectForm: Form[Infoobject],nav: String = "")

@form(routes.Admin.admin_createMapInstance()) {
        <fieldset>
        @select(
                infoObjectForm("infoobjectId"), 
                options(Infoobject.all_values), 
                'id -> "infoobjects_field",
                '_label -> "Infoobject", '_default -> "--Select Infoobject--",
                '_showConstraints -> false, 'value -> infoObjectForm
            )
        </fieldset>

        <div class="actions">
            <input type="submit" value="Create this Map Instance" class="btn primary"> or 
            <a href="@routes.Admin.admin_MapInstance()" class="btn">Cancel</a> 
        </div>
    }

此下拉列表显示我的所有信息对象。当我选择一个并点击提交按钮时,我想在控制器中使用所选的InfoObject(及其属性)。

Form<Infoobject> mapForm = form(Infoobject.class).bindFromRequest();
        if(mapForm.hasErrors()) {
            flash("error", "MapForm contains an error");
            return badRequest(createMapForm.render(mapForm, ""));
        }
Infoobject infoobject = mapForm.get();
String desig = infoobject.getDesignation();
String desc = infoobject.getDescription();
...

mapForm有错误。你们知道为什么吗?

Infoobject模型:

@Entity
public class Infoobject extends Model {
@Id
    @SequenceGenerator(name="infoobject_seq", sequenceName="infoobject_id_seq", allocationSize=1000)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="infoobject_seq")
    public Long infoobjectId;

    @Required
    public String designation;
    @Required
    public String description;
        ...getters/setters

我尝试在视图中使用两个@inputText字段,因此我可以创建一个有效的信息对象。但现在我不想创建现有信息对象的地图实例。

感谢您的帮助!

编辑:在控制台中打印错误,说“error.required”。任何人?似乎表单不包含任何Infoobject。发现this类似的问题/答案。为什么这不起作用?

2 个答案:

答案 0 :(得分:0)

这个解决方案有效,但我不认为这是最好的方法。

<form>
        @select(
                infoObjectForm("infoobjectId.id"), 
                options(Infoobject.all_values), 
                'id -> "infoobjects_field",
                '_label -> "Infoobject", '_default -> "--Select Infoobject--",
                '_showConstraints -> false
            )
        <div class="actions">
            <input type="button" value="Create this Map Instance" class="btn primary" onclick="JavaScript:createMap()"> or 
            <a href="@routes.Admin.admin_MapInstance()" class="btn">Cancel</a> 
        </div>
    </form>
    <script>
        function createMap() {
            var ioId = document.getElementById('infoobjects_field').value;
            if(ioId) {
                var nextUrl = "/CreateMapInstance?ioId="+ioId;
                window.location = nextUrl;
            }
        }
    </script>

我会做一个GET并只在网址中发送ID而不是在POST中发送整个Info对象。

答案 1 :(得分:0)

在@select标签中输入infoObjectForm(“infoobjectId”)

在模型类Infoobject中添加:

static {
    play.data.format.Formatters.register(Infoobject.class, new ClassFormatter());
}

public static class ClassFormatter extends SimpleFormatter<Infoobject> {

    @Override
    public Infoobject parse(String text, Locale locale) {
        if (text == null || text.trim().length() == 0)
            return null;
        return Infoobject.find.byId(Long.parseLong(text.trim()));
    }

    @Override
    public String print(Infoobject value, Locale locale) {
        return (value == null || value.id == null ? "" : value.id.toString());
    }
}