2010-01-08 3 views
4

В моем приложении Spring у меня есть 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 ... (все идентификаторы в списке с разделителями-запятыми) без возможности определения которая была нажата. Я не хочу указывать разные действия для каждой кнопки, так как количество элементов может расти, и действие для них одинаково, просто с другим идентификатором.

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

ответ

7

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

<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

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

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

+2

Пожалуйста, не используйте Javascript для этого. Это не имеет никакого смысла. – BalusC

0

У вас есть 3 варианта -
1 Используйте несколько форм и введите кнопку отправки в каждой форме, как указано выше. Сгенерированный код будет не очень красивым, и обычно считается, что плохая практика имеет несколько форм на странице.
2. Используйте Javascript hack для установки скрытой переменной при нажатии кнопки отправки.
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

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

+1

Разве это не дает вам «значение» входного элемента, который будет «выбирать» для каждой из кнопок? – RustyTheBoyRobot

Смежные вопросы