Иметь несколько кнопок отправки в форме и определить, какие из них были нажаты в контроллере - PullRequest
4 голосов
/ 08 января 2010

В моем приложении Spring у меня есть jsp, который имеет форму, в которой я хочу иметь несколько кнопок отправки, которые идут на один и тот же контроллер. Мне нужно иметь возможность определить, какая кнопка была нажата в контроллере. Форма отображает количество элементов для пользователя, и они могут выбрать один из элементов, с той лишь разницей, что идентификатор выбранного элемента.

В jsp я создаю форму, подобную этой:

<form:form method="post" commandName="myCommand">

    <c:forEach items="${model.availableitems}" var="item">
      <span class="item">${item.description}</span> 
      <input type="hidden" name="id" value="${item.ID}"/>
      <input type="submit" name="SelectButton" value="Select" />
    </c:forEach>

  </div> 
</form:form>

Однако, это дает мне сообщение «Ошибки привязки данных: 1» в журнале, и форма не передается контроллеру.

Я попытался изменить myCommand.id с int на String, но затем при отправке им присваивается значение id1, id2, id3 ... (все идентификаторы в списке с разделителями-запятыми) без возможности определить, кнопка была нажата. Я не хочу указывать разные действия для каждой кнопки, поскольку количество элементов может увеличиваться, и действие для них одинаково, только с другим идентификатором.

Как мне иметь несколько кнопок в этой форме и получить значение в контроллере?

Ответы [ 4 ]

7 голосов
/ 08 января 2010

Почему бы просто не использовать отдельную форму для каждого элемента?

<c:forEach items="${model.availableitems}" var="item">
  <form:form method="post" commandName="myCommand">
    <span class="item">${item.description}</span> 
    <input type="hidden" name="id" value="${item.ID}"/>
    <input type="submit" name="SelectButton" value="Select" />
  </form:form>        
</c:forEach>
0 голосов
/ 29 июня 2012

Вы можете использовать параметр аннотации @RequestParam("SelectButton") String submit в списке аргументов вашего контроллера.

0 голосов
/ 07 октября 2010

У вас есть 3 варианта -
1. Используйте несколько форм и имейте кнопку отправки в каждой форме, как предложено выше. Сгенерированный код выглядит не очень красиво, и обычно считается плохой практикой иметь несколько форм на странице.
2. Используйте взлом Javascript, чтобы установить скрытую переменную при нажатии кнопки отправки.
3. Если вам нужно обработать запасной вариант (без JavaScript), то существует обходной способ выяснить, какая кнопка была нажата. Вот пример -

<form:form method="post" commandName="myCommand">            
    <c:forEach items="${model.availableitems}" var="item">            
        <span class="item">${item.description}</span>             
        <input type="submit" name="${item.ID}" value="Select" />            
    </c:forEach>
</form:form>                    

Устанавливает уникальный идентификатор для каждой кнопки. Поскольку параметры запроса идут как пары «ключ-значение», в этом случае нам придется выполнить обратный поиск, поскольку мы имеем значение в ключевой позиции. Вот java сторона этого ... не уверен, что это самый эффективный способ сделать это, но он работает.

String searchButtonName(final HttpRequest request) { 
    String buttonName = ""; 
    Map<String, String[]> paramMap = request.getParameterMap(); 
    if (MapUtils.isNotEmpty(paramMap)) { 
            for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
                    /* Search for the button name as given in 
                       the 'value' attribute for the input tag */
                    if ("Select".equals(entry.getValue()[0])) { 
                            buttonName = entry.getKey(); 
                            break; 
                    } 
            } 
    } 
    return buttonName; 
} 
0 голосов
/ 08 января 2010

вместо использования кнопки отправки используйте кнопку, которая вызывает функцию, которая устанавливает значение скрытого поля, и вызывает form.submit()

Вы можете создавать кнопки, используя цикл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...