Как установить выбранное значение в форме Spring MVC: выбрать из контроллера? - PullRequest
11 голосов
/ 31 мая 2011

В моем контроллере:

@Controller
public class UserController {

    @RequestMapping(value="/admin/user/id/{id}/update", method=RequestMethod.GET)
    public ModelAndView updateUserHandler(@ModelAttribute("userForm") UserForm userForm, @PathVariable String id) {

        Map<String, Object> model = new HashMap<String, Object>();
        userForm.setCompanyName("The Selected Company");
        model.put("userForm", userForm);

        List<String> companyNames = new ArrayList<String>();
        companyNames.add("First Company Name");
        companyNames.add("The Selected Company");
        companyNames.add("Last Company Name");

        model.put("companyNames", companyNames);

        Map<String, Map<String, Object>> modelForView = new HashMap<String, Map<String, Object>>();
        modelForView.put("vars", model);

        return new ModelAndView("/admin/user/update", modelForView);
    }
}

Поле выбора формы на мой взгляд:

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm">
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="id" itemLabel="companyName" />
</form:form>

Насколько я понимаю, компонент поддержки формы будет отображаться на основе атрибута modelAttribute в форме. Я явно что-то здесь упускаю.

Ответы [ 5 ]

11 голосов
/ 03 июня 2011

Кажется, проблема не связана с моей настройкой. Проблема заключалась в том, что itemValue было установлено в свойство id компании, тогда как сравнение проводилось со свойством name компании в компоненте, поддерживающем форму. Таким образом, эти два не были равны, и, следовательно, ни один элемент не был выбран.

Приведенный выше код работает просто отлично, и установка значения в пользовательской форме для определенного свойства установит это значение как выбранное в полях формы выбора, при условии, что значение одного из элементов в коллекции элементов равно форме значение. Я изменил свое поле формы, чтобы оно выглядело следующим образом: вместо идентификатора вместо имени используется имя компании.

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm">
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="companyName" itemLabel="companyName" />
</form:form>
8 голосов
/ 08 ноября 2014

Самое простое решение - переопределить метод toString () в классе модели.В этом случае просто измените класс UserForm, переопределив toString (), как показано ниже:

@Override
public String toString() {
    return this.getCompanyName();
}

Spring, затем автоматически выберет правильное значение в форме: option

6 голосов
/ 22 октября 2014

Вы также можете попробовать вот так

<form:select id="selectCategoryId" path="categoryId"
      class="selectList adminInput admin-align-input" multiple="">
      <option value="0">-- Select --</option>
      <c:forEach items="${categories}" var="category">
            <option <c:if test="${category.key eq workflowDTO.categoryId}">selected="selected"</c:if>    value="${category.key}">${category.value} </option>
        </c:forEach>
</form:select>
6 голосов
/ 04 февраля 2012

Я боролся некоторое время по тому же вопросу. Это поле выбора у меня было

<form:select path="origin" items="${origins}" itemValue="idOrigin" itemLabel="name" />

Так как у меня был PropertyEditor для моей сущности, я не мог написать что-то вроде

<form:select path="origin.idOrigin" items="${origins}" itemValue="idOrigin" itemLabel="name" />

, который работал нормально, но не был проанализирован PropertyEditor.

Итак, подумав о необходимости Spring определить равенство между сущностями, я реализовал реализацию equals и hashcode в моей сущности Origin, используя только свойство idOrigin, и это сработало!

3 голосов
/ 31 мая 2011

это не так сложно. Вам нужны 2 компонента: компонент поддержки формы и модель выбора в вашей доменной модели.

Вот моя модель, список строк, для:

/* in controller: my select model is a list of strings. However, it can be more complicated, then you had to use PropertyEditors for String <-> Bean conversions */

    List<String> mySelectValues = new ArrayList<String>();
    mySelectValues.add("M");
    mySelectValues.add("F");
    modelMap.addAttribute("mySelectValues", mySelectValues);

Вот ваша форма, в основном:

<form:form command="user">
  <form:select path="gender">
     <form:options items="${mySelectValues}"></form:options>                                                                                                       
  </form:select>    
</form:form>

и вот мой вспомогательный объект:

public class User {
    private String gender;
    /* accessors */
}

Spring Framework выбирает автоматически, используя значение поля "пол".

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