2011-06-19 14 views
7

Al utilizar objetos de comando parece que no entiendo automática de unión del campo idgriales comando unión del campo id

class somethingCommand { 

int id 
String A 
String B 

// some methods here like Domain.get(id) 

} 

Mi A y B cadena de obtener datos de auto-mágicamente binded de las propiedades del formulario, pero los datos de objetos no id. Los otros "campos ocultos" de la versión de tipo grails, dateCreated o lastUpdated también se enlazan correctamente.

Mi solución parche actual es la siguiente: recurro a definir otro campo id oculto en mi forma

<g:hiddenField name="blogId" value="${blog?.id}"/> 

y cambiar el nombre id para blogid en el obect mando y que funciona.

Esto no parece estar en línea con la elegancia de Grails. ¿Qué me falta en las reglas de enlace de datos del objeto Comando vs controlador?

+0

fue la identificación previamente en la forma antes de agregar el campo oculto? ¿Funcionó con el campo oculto con name = id? Los algoritmos de enlace de datos intentarán unir los campos con los nombres de las propiedades; ¿quizás haya varios campos de identificación y se haya confundido? –

+0

Endurece Stéphane ... :) –

Respuesta

7

seguimiento a este problema:

me encontré con el mismo problema: tenía un comando con un parámetro de Identificación del .Cuando llamé a mi controlador sobre una acción que usó el comando, todos los parámetros se vincularon correctamente excepto el id.

Resultó que si usted tiene un campo llamado versión en su orden, no será asignado al campo Identificación.

Si cambia el nombre de su campo de versión por otra cosa (es decir, readVersion), entonces la identificación se asignará correctamente.

Espero que ayude,

Vicente Giguere

+1

Siguiendo que esta es una característica, asumí error al principio. http://jira.grails.org/browse/GRAILS-6190 –

3

Lo he usado varias veces.

El parámetro id está vinculado a su comando como cualquier otro campo. No hay un comportamiento especial en este campo en particular

Ahora, si está enviando un valor para el campo de id. Que es incompatible con el tipo del campo de id de su comando, entonces el campo no estará vinculado. Va a no obtener una ClassCastException o algo por el estilo. Acabará teniendo un valor nulo para el campo.

recuerdo haber visto algo complicado de lo siguiente: Si usted tiene una Identificación tanto en su URL (ex controlador/acción/ID.) y en su forma, el ID de la URL tiene prioridad.

Así que si su forma tiene un campo oculto adecuada para la identificación

<field type="hidden" name="id" value="1"/> 

pero la acción es de alguna manera la pata en su forma

<g:form action="doSometing" id="some-incompatible-value">...</g:form> 

Lo que se puede recibir en el controlador es:

params.id = "some-incompatible-value" 

Lo que haría imposible que Grails convierta su parámetro de id a un largo o un n int y su objeto de comando tendrían

command.id = null 

lo tanto, mi consejo sería: empezar de nuevo y volver a escribir su formulario desde cero y asegúrese de que el valor en el que la forma, como lo ve desde su controlador de params.id es compatible con el tipo de campo de id de su comando.

Dejarme saber cómo va.

Vicente Giguère