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