Play Framework Как передать коллекцию в действие create ()? - PullRequest
0 голосов
/ 05 октября 2011

Я начинаю с Play Framework. У меня проблема с передачей параметров.
Я хочу передать коллекцию из представления в контроллер. И я не знаю, как это сделать. Я всегда получаю «ноль», когда я получаю коллекцию из вида. Мой код ниже:
Код в контроллере:

public static void create(List<Book> books) throws Exception {
     for(Book book : books){
          System.out.println(book.get(0).author) // i got null :(
     }
}

Код в HTML

Book 1:
<input type="text" name="books.author" />
<input type="text" name="books.title" />
Book 2:
<input type="text" name="books.author" />
<input type="text" name="books.title" />

Когда я отправляю, я хочу добавить 2 записи в базу данных, включая Book1 и Book2. Пожалуйста, поддержите меня

Спасибо

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Вы можете сделать эту работу, просто добавив индикатор массива в ваш HTML-код

Book 1:
<input type="text" name="books[0].author" />
<input type="text" name="books[0].title" />
Book 2:
<input type="text" name="books[1].author" />
<input type="text" name="books[1].title" />

Я проверил это решение, и оно отлично работает.

Также обратите внимание, что ваш println не будет компилироваться, так как вы вызываете get(0) для объекта Book, а не для объекта List. Если вы просто печатаете book.author, он выводит автора по мере необходимости.

0 голосов
/ 13 апреля 2012

В случае, если кому-то нужен пример Javascript для динамического добавления и удаления книг (необходим JQUERY):

<script type="text/javascript">
  $(document).ready(function() {
        var bookCount=0;
        $('#btnAddBook').click(function() {
            bookCount++;
            //newElem = go up a to the parent div then grab the previous container
            var newElem = $(this).parent().prev().clone().attr('id', 'book[' + bookCount + ']');
            //for each input inside the div, change the index to the latest bookCount
            $(newElem).find("input").each(function(){
                var name = $(this).attr('name');
                var leftBracket = name.indexOf("[");
                var rightBracket = name.indexOf("]");
                var beforeBracketString = name.substring(0,leftBracket+1);//+1 to include the bracket
                var afterBracketString = name.substring(rightBracket);
                $(this).attr('name', beforeBracketString + bookCount + afterBracketString);
            });
            //insert it at the end of the books
            $(this).parent().prev().after(newElem);
            $(newElem).find("input").each(function(){
                    $(this).attr('id', $(this).attr('id') + bookCount);
                });
            //enable the remove button
            $('#btnRemovebook').removeAttr('disabled');
            //If we are at 16 divs, disable the add button
            if (bookCount == 15)
                $(this).attr('disabled','disabled');
        });
        $('#btnRemoveBook').click(function() {
            bookCount--;
            //remove the last book div
            $(this).parent().prev().remove();
            //in case add was disabled, enable it
            $('#btnAddbook').removeAttr('disabled');
            //never let them remove the last book div
            if (bookCount == 0)
                $(this).attr('disabled','disabled');
        });
    });
</script> 
<!-- HTML Snippet -->
<div id="book[0]">
    <label> Book: </label>
    <input type="text" name="books[0].author" value="Author" />
    <input type="text" name="books[0].title" value="Title" />
</div>
<div>
    <input type="button" id="btnAddbook" value="Add another book" />
    <input type="button" id="btnRemovebook" value="Remove last book" disabled="disabled" />
</div>
<!-- REST of the HTML -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...