12

String とリストを含むモデルがあります。

public String title;    
public List<String> topics;

index.scala.html では、フォームを使用して新しいアイテムを追加します。

@form(routes.Application.newPaper()) {
    @inputText(paperForm("title"))
    <input type="submit" value="Create">
    }

単純な文字列を使用すると、これはうまく機能します。しかし、チェックボックスを表示したい

@for(t <- topics) {
    <input type='checkbox' name='topic' value=@t>@t <br>
}

その後、チェックしたすべての「トピック」をList<String> topics;新しいアイテムのに追加します。@form{ ... } 内でチェックボックスを処理するにはどうすればよいですか?

4

1 に答える 1

17

私はPlay!Framework 2.1.0を使用しています。以下が解決策です:

1. scala テンプレートでは、次のようにすべてのチェックボックス名を指定する必要があります。

@form(action = routes.Application.newPaper()) {
   @inputText(paperForm("title"))

   @******* Indexed chekbox name *********@
   @for((t, index) <- topics.zipWithIndex) {
       <input type="checkbox" name="topics[@index]" value="@t">@t <br>
   }

   <input type="submit" value="Create">
}

2.次に、コントローラーで、フォーム送信を処理するアクションとして、次のようなことを行う必要があります

public static Result newPaper() {
    // Bind submitted form value to your model, ex. Paper.java
    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
    Paper paper = paperForm.get();

    Logger.info("Title entered = " + paper.title);
    // Because in template we use indexed name, unchecked item are binded with null value
    paper.topics.removeAll(Collections.singleton(null)); // remove value for unchecked topic
    for (String t : paper.topics) {
       Logger.info("The topic is " + t);
    }
    Logger.info("Total topic selected = " + paper.topics.size());

    return redirect(routes.Application.index()); // redirect page
}

アップデート

これは、ソリューションの別のアイデアです。scala テンプレートのチェックボックス コードは変更されません

@for(t <- topics) {
    <input type='checkbox' name='topic' value=@t>@t <br>
}

したがって、コントローラーは次のようになります。

public static Result newPaper() {
    // Bind submitted form value to your model, ex. Paper.java
    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
    Paper paper = paperForm.get();

    // get request value from submitted form
    Map<String, String[]> map = request().body().asFormUrlEncoded();
    String[] checkedVal = map.get("topic"); // get selected topics

    // assign checked value to model
    paper.topics = Arrays.asList(checkedVal);

    // for debugging purpose
    for (String t : paper.topics) {
        Logger.info("The topic is " + t);
    }
    Logger.info("Total topic selected = " + paper.topics.size());

    return redirect(routes.Application.index()); // redirect page
} 

このアイデアがよりエレガントであることを願っています.. :)

注: Play!Framework 2.1.1 でもテストしましたが、これで問題ありません。

于 2013-03-04T11:06:14.533 に答える