2012-01-04 13 views
13

Usé ModelAttribute para vincular el objeto en la aplicación web Spring.Los valores de la casilla de verificación no se unen al objeto cuando son falsos?

Una vez que noto que, en caso de que un objeto tenga un valor booleano A es verdadero, su valor no se actualizará si desmarcamos la casilla de verificación de A.

Por ejemplo, tengo un objeto Lesson que tiene el atributo "active" = true. En la vista "Editar lección", hago una casilla que se une a "activa". Las cosas funcionan bien si la casilla de verificación está marcada (el objeto de enlace refleja los cambios), pero la lección de objeto no cambiará si deseleccionamos la casilla de verificación.

El estudio adicional me dice que esto se debe a que el valor de la casilla de verificación puede no ser enviado por el navegador (este es un diseño de HTML). Así que tengo que usar el feo request.getParameter para verificar si el valor está establecido.

Acabo de llegar por this question, y veo que asp.net mvc proporciona una manera de evitarlo de forma más elegante. Creo que Spring debe proporcionar algo similar. ¿Alguien sabe cómo hacer eso?

que sigue es mi código: Código

controlador:

@RequestMapping(value="/test", method = RequestMethod.POST) 
    public String processEditLesson(@Valid Lesson lesson, BindingResult bindingResult, Model model) { 
     System.out.println("Lesson is active: " + lesson.isActive()); // still "true" even if the checkbox is unset 

     // Current work-around 
     String isActive = request.getParameter("active"); 
     if (StringUtils.isNotNullOrEmpty(isActive)) { 
      lesson.setActive(true); 
     } else { 
      lesson.setActive(false); 
     } 
     ... 
    } 

Ver código:

<form id="lesson" class="EditorForm" action="${rc.getContextUrl('/test.html')}" method="post" > 

    <fieldset> 
     <legend><@spring.message code="lesson.edit"/></legend> 
     <@spring.formHiddenInput "lesson.id" /> 
     <@spring.formHiddenInput "lesson.studio.id" /> 

     <div class="Entry"> 
      <label for="name"><@spring.message code="lesson.message"/></label> 
      <@spring.formInput "lesson.message" /> 
      <span class="ErrorMessage"><@spring.showErrors "<br/>" /></span> 
     </div> 

     <input type="checkbox" name="active" checked="checked" /> 
     <label for="active">${rc.getMessage('lesson.active')}</label> 

     <input type="submit" value="<@spring.message code='common.update' />" /> 
    </fieldset> 
</form> 

Respuesta

20

primavera ha construido en la solución.

sólo tiene que añadir este campo oculto adicional a la forma:

<input type="hidden" value="on" name="_active"/>

El parámetro con un subrayado inicial es algún tipo de marcador, para indicar la existencia de un parámetro casilla con el mismo nombre, pero sin el guión bajo.

El muelle ahora debe establecer lesson.active en falso si solo se envía _active=on.

+0

Gracias, ¿cómo sabes de esta manera? Quiero decir, he buscado mucho sin encontrar ningún resultado. Solo un pequeño arreglo: necesito usar "_active" en lugar de "_lesson.active" para que funcione. –

+1

He corregido los nombres. - ¿Cómo lo sé? Estoy haciendo Spring MVC de manera profesional durante más de 5 años. Cuando comencé esta pregunta era muy popular. Por cierto: si usa la etiqueta jsp de la casilla de verificación Spring, el archivo oculto ya está incluido. – Ralph

+1

Información útil. Sin embargo, creo que si el nombre del elemento contiene '.', el valor no cambiará automáticamente. Creo que tendré que cambiarlo usando JavaScript – abiieez

2

Creo que deberías usar etiquetas springframework, ¿por qué estás utilizando plain html? Si su vista es simplemente importar página JSP:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

y luego se puede utilizar:

<form:checkbox path="path" label="label" /> 

que se ocupa del problema.

+0

gracias por el método jsp, pero en realidad yo uso freemarker. Freemarker macro formCheckBoxes no tiene ningún ejemplo para ir con él –

1

Puede usar etiquetas de marco de resorte, ya que establecerá automáticamente el valor seleccionado para la clase de bean y, a continuación, será muy fácil obtener su valor en la clase de controlador.

en el camino de lo que necesita para poner su grano de nombre de variable

y utilizar esto es necesario dar el nombre de comando al formulario y el uso que mandan nombre para vincular a su objeto bean a la JSP

modelo. addAttribute ("nombre de comando", objeto bean) use esto en su controlador para vincular el objeto.

+0

lo siento, pero NO uso jsp. Uso freemarker, y si sabes cómo escribirlo en freemarker, házmelo saber. Por ahora, usé mi macro personalizada en su lugar. –

+0

lo siento, no hay idea para ese amigo! – Raj

Cuestiones relacionadas