一种形式的多种形式播放[2.0.4]

时间:2013-03-14 14:10:09

标签: java playframework playframework-2.0 html-form

我正在尝试创建一个具有一个模型和两个始终相同的值的表单,但有一个值会发生变化。

我的html表单是:

@helper.form(action = routes.TeacherController.putQuestionToAssignment(), 'class -> "form-horizontal") {

            <input type="hidden" name="size" value="@{size}">
            <input type="hidden" name="assignment_id" value="@{assignment_id}">
            @for(question <- questions){
                <input type="checkbox" name="question_id" value="@{question.question_id}">
            }
                <button type="submit" class="btn btn-primary" value="submit">create</button>
    }

我的模特:

@Entity
public class Verkefnaspurningar extends Model {
    @Id
    public int verkefnaspurningar_id;
    @Constraints.Required
    public int assignment_id;
    @Constraints.Required
    public int question_id;
    @Constraints.Required
    public Double size;

并且在控制器中我将尝试为表单中的复选框中检查的每个问题创建一个模型,但我不知道如何做到这一点,我可以在question_id字段中设置id形式和循环通过?

public static Result putQuestionToAssignment(){
        Form<Verkefnaspurningar> verkefnaspurningarForm = form(Verkefnaspurningar.class).bindFromRequest();
            int question_id= verkefnaspurningarForm.get().question_id;
            Double size= verkefnaspurningarForm.get().size;
            int assignmentId= verkefnaspurningarForm.get().assignment_id;
            Verkefnaspurningar verkefnaspurningar = Verkefnaspurningar.create(assignmentId, question_id, size);

        return redirect(routes.TeacherController.createAssignment());
    }

希望这篇文章不要愚蠢,我的第一个,亲切的问候Björn。

2 个答案:

答案 0 :(得分:1)

以下是我对您的问题的解决方案的想法。但是,我使用 Play!Framework 2.1.0 测试此解决方案。

控制器中,您可以获得用户提交的已检查question_id值,如下所示:

public static Result putQuestionToAssignment() {
    // get all HTTP request value from submitted form
    Map<String, String[]> map = request().body().asFormUrlEncoded();
    String[] allCheckedData = map.get("question_id"); // get all checked question
    ... // bind the rest of request parameter to variable if needed

    Verkefnaspurningar verkefnaspurningar;
    // Loop for each checked question
    for (String t : allCheckedData) {
        Logger.info("Checked data is " + t);
        verkefnaspurningar = new Verkefnaspurningar(); // create each data
        ... // put the rest of code for saving the model
    }

    return TODO; // still dummy. Should be redirect!
}

请注意,我在此解决方案中未使用Form。我使用request().body().asFormUrlEncoded()从提交的表单中获取所有请求参数。查看RequestBody here的文档。

答案 1 :(得分:0)

我会为此使用DynamicForm。它会是这样的:

public static Result putQuestionToAssignment(){

        DynamicForm form = form().bindFromRequest();

        Set<Long> ids = new HashSet<Long>();
        for (Entry<String, String> entry : form.data().entrySet()) {
                ids.add(Long.valueOf(entry.getValue()));
        }

        Verkefnaspurningar verkefnaspurningar;
        for (Long id : ids) {
                verkefnaspurningar = Verkefnaspurningar.create(assignmentId, id, ids.size());
        }
        return redirect(routes.TeacherController.createAssignment());
}

要获得assignmentId,您可能需要在循环form.data().entrySet()时添加条件:if entry.getKey()如果是您的任务,那么存储ID,否则为Set添加值