2012-07-20 13 views
6

estado teniendo toruble con el botón que tiene acción. Tengo varios btns que quiero conocer su paramaestro. En griales tutorial dice que debe ser así:cómo pasar los parámetros usando el botón de acción en grails

<g:actionSubmit action="action" value="${message(code: 'default.button.edit.label', default: 'Edit')}" params="['actionTaken':editPhone]"/> 

He intentado utilizar RemoteLink, submitButton, etiquetas submitToRemote pero ninguno funciona. Siempre tengo nula cuando intento analizarlo en mi controlador:

def action= 
    { 
     def actionTaken = params.actionTaken 
     def employeeId= params.employeeId 

     MySession session = MySession.getMySession(request, params.employeeId) 
     profileInstance = session.profileInstance 

     switch(actionTaken) 
     { 
      case "editPhone" : 
       isEditPhone=true 
       break 

      case "editEmail" : 
       isEditEmail=true 
       break 
     } 
     render(view:"profile", model:[profileInstance:session.profileInstance, isEditPhone:isEditPhone, isEditEmail:isEditEmail]) 
    } 

¿Qué me falta? es mi código de params mal? ¿Mi código en el análisis de parámetros está equivocado? esto solo me pone en círculos sin progreso. ayuda. Gracias.

+0

¿Ha intentado ** **. Tal vez olvidé {} en el atributo de params, si no funciona intente ponerlos como ** [{}] ** o ** {[]} ** No recuerdo cómo fue. Sry – axierjhtjz

Respuesta

7

Grails documentation no figura params como uno de los atributos aceptados por actionSubmit.

Se es posible inyectar el valor que desee en la lista de parametros en el controlador explotando lo que la etiqueta realidad hace:

def editPhone = { forward(action:'action', params:[actionTaken: 'editPhone'])} 
def editEmail = { forward(action:'action', params:[actionTaken: 'editEmail'])} 

Es posible que también acaba de querer solo código de la lógica completamente separados en las acciones editPhone y editEmail si eso hace que su código sea más limpio.

Actualizado Ver código:

<g:actionSubmit action="editPhone" value="${message(code: 'default.button.edit.label', default: 'Edit')}" /> 
4

El atributo params se analiza como un mapa, donde las claves se tratan unas secuencias pero los valores se tratarán como expresiones. Por lo tanto

params="['actionTaken':editPhone]" 

está tratando de definir la clave denominada actionTaken tener el valor de la variable llamada editPhone en el modelo SGP. Como no existe tal variable, obtienes nulo. Así que la solución es mover las comillas:

params="[actionTaken:'editPhone']" 

que permitirá establecer el valor a la cadena "editPhone".

+2

En realidad, ya lo hice antes de publicar aquí y todavía nulo. :( – user742102

+0

Esto no funciona para grails 2.0 –

0

que acaba de tener un problema similar (que tenía que presentar una eliminación junto con un id) y halló una solución usando el atributo "formAction" de HTML5 para presentar insumos. Se les puede dar un valor que puede incluir un controlador, acción, parámetros adicionales, etc.

En general, para agregar un parámetro a un botón de envío como una edición de un subobjeto específico en un formulario se vería de esta manera:

<input type="submit" formaction="/<controller>/<action>/<id>?additionalParam1=...&additionalParam2=..." value="Action" > 

y en su ejemplo:

<input type="submit" formaction="action?actionTaken=editPhone" value="${message(code: 'default.button.edit.label', default: 'Edit')}" > 
2

también podría pasar el parámetro dentro del poste-datos utilizando

<input type="hidden" name="actionTaken" value="editPhone" /> 

dentro del formulario. Luego también se puede acceder a través de la variable params. Funciona para mí.

+0

Esta es la respuesta correcta. Debes recordar que el contexto de está dentro de un formulario, y que el formulario se enviará a la acción enumerada en la etiqueta . – nby

0

En mi situación, tenía un único elemento de formulario con varias acciones en cada fila de una tabla (es decir, botones de edición de la tabla de datos). Era importante enviar toda la información del formulario, así que no podía usar enlaces. La forma más rápida que encontré para inyectar un parámetro fue con javascript. No es ideal, pero funciona:

function injectHiddenField(name, value) { 
    var control = $("input[type=hidden][name='" + name + "']"); 
    if (control.size() == 0) { 
     console.log(name + " not found; adding..."); 
     control = $("<input type=\"hidden\" id=\"" + name + "\" name=\"" + name + "\">"); 
     $("form").append(control); 
    } 
    control.val(value); 
} 

Su botón puede tener este aspecto:

<g:each in="${objects}" var="object"> 
    ... 
    <g:actionSubmit value="edit" action="anotherAction" 
        onclick="injectHiddenField('myfield', ${object.id})"/> 
</g:each> 
Cuestiones relacionadas