2011-05-30 24 views
11

En mi controlador:¿Cómo configuro el valor seleccionado en un formulario Spring MVC: seleccione desde el controlador?

@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); 
    } 
} 

el campo Seleccionar forma en mi opinión:

<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> 

Fue mi entendimiento de que el grano de forma respaldo se asigna basándose en el atributo modelAttribute en el formulario. Obviamente me falta algo aquí.

+0

Parece que el problema no estaba relacionado con mi configuración.El problema era que itemValue se estableció en la propiedad de identificación de la compañía, mientras que la comparación se realizaba con la propiedad del nombre de la empresa en mi bean de respaldo. Entonces los dos no eran iguales, y por lo tanto, no se estableció ningún elemento para ser seleccionado. –

Respuesta

11

Parece que el problema no estaba relacionado con mi configuración. El problema era que itemValue se estableció en la propiedad de identificación de la compañía, mientras que la comparación se realizaba con la propiedad del nombre de la empresa en mi bean de respaldo. Entonces los dos no eran iguales, y por lo tanto, no se estableció ningún elemento para ser seleccionado.

El código anterior funciona bien, y establecer el valor en el userForm para una propiedad particular establecerá ese valor como seleccionado en campos de formulario seleccionados siempre que el valor de uno de los elementos en la colección de elementos sea igual al valor de forma Cambié mi campo de formulario para que se vea así, que saca el nombre de compañía en lugar de la identificación.

<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> 
+1

Tenga en cuenta que la "comparación" de la cual el autor está escribiendo es el método "igual" en el bean de respaldo de formulario. –

3

no es tan complicado. Necesita 2 beans: un bean de respaldo de formulario y un modelo seleccionado en su modelo de dominio.

Aquí es mi modelo, una lista de cadenas, para:

/* 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); 

Aquí es su forma, básicamente:

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

und aquí está mi respaldo objeto:

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

Marco de resorte selecciona automáticamente usando el valor del campo "género".

+0

¿Podría incluir el controlador completo? Eso podría darme más información, ya que aún no estoy seguro de entender. Además, ¿es necesario usar el atributo de comando en la etiqueta de formulario? Estoy usando modelAttribute actualmente. –

+0

No importa. Por favor, vea el comentario anterior. –

+0

¿Qué debo hacer si deseo lograr lo mismo para un objeto personalizado en lugar de 'String'? – sarwar026

6

Estuve teniendo problemas con el mismo problema. Este es el campo de selección tuve

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

Ya que tenía un PropertyEditor en su lugar para mi entidad no podría escribir algo así como

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

que funcionaba bien, pero no se ha analizado por el PropertyEditor .

Entonces, pensando en la necesidad de Spring de determinar la igualdad entre las entidades, salí implementando equals y hashcode en mi entidad Origin usando solo la propiedad idOrigin, ¡y funcionó!

5

También puede tratar como esto

<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> 
8

La solución más fácil es reemplazar el método toString() de la clase del modelo. En este caso, basta con cambiar el formulario de usuario clase anulando toString(), como a continuación:

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

primavera continuación, selecciona automáticamente el valor correcto en el formulario: opción

Cuestiones relacionadas