2012-07-20 9 views
6

state avendo toruble con il pulsante che ha azione. Ho parecchi cnn che voglio conoscere il suo paramaeter. In graal tutorial dice che dovrebbe essere simile a questo:come passare params utilizzando il pulsante di azione in grails

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

Ho provato ad utilizzare RemoteLink, submitButton, tag submitToRemote ma nessuno funziona. Ho sempre trovato nulla quando provo parsing nel mio controller:

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]) 
    } 

Che cosa mi manca? il mio codice params è sbagliato? Il mio codice è in errore durante l'analisi dei parametri? questo mi mette semplicemente in circolo senza progressi. Aiuto. Grazie.

+0

Hai provato ** **. Forse ho dimenticato {} sull'attributo params, se non funziona prova a metterli come ** [{}] ** o ** {[]} ** Non mi ricordo come è stato. Sry – axierjhtjz

risposta

7

Il Grails documentation non elenca params come uno degli attributi accettati da actionSubmit.

E è possibile iniettare il valore che volete nella vostra lista params nel controller sfruttando quello che tag realtà fa:

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

si potrebbe anche voler solo a poco codice della logica completamente separato nelle azioni editPhone e editEmail se questo rende il tuo codice più pulito.

Aggiornato Visualizza codice:

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

L'attributo params viene analizzato come una mappa, dove le chiavi sono trattati a corde, ma i valori vengono trattati come espressioni. Pertanto

params="['actionTaken':editPhone]" 

sta cercando di definire la chiave di nome actionTaken ad avere il valore della variabile denominata editPhone nel modello GSP. Dato che non esiste una variabile di questo tipo, stai ricevendo il valore null. Quindi la correzione è spostare le virgolette:

params="[actionTaken:'editPhone']" 

che imposterà il valore sulla stringa "editPhone".

+2

In realtà, l'ho già fatto prima di postare qui e ancora null. :( – user742102

+0

Questo non funziona per Grails 2.0 –

0

Ho appena avuto un problema simile (avevo bisogno di presentare una eliminare con un id) e abbiamo trovato una soluzione che utilizza l'attributo "FormAction" di HTML5 per presentare-ingressi. È possibile assegnare un valore che può includere un controller, un'azione, parametri aggiuntivi, ecc.

In generale, per aggiungere un parametro a un pulsante di invio come una modifica di un oggetto secondario specifico in un modulo appare in questo modo:

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

e nel tuo esempio:

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

si potrebbe anche passare il parametro all'interno di post-dati utilizzando

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

all'interno del modulo. Quindi è anche accessibile attraverso la variabile params. Funziona per me.

+0

Questa è la risposta corretta imho. Devi ricordare che il contesto di è all'interno di un modulo, e che il modulo verrà inviato all'azione elencata in il tag . – nby

0

Nella mia situazione, avevo un singolo elemento di forma con più azioni su ogni riga di una tabella (cioè i pulsanti di modifica della tabella di dati). Era importante inviare tutti i dati del modulo in modo che non potessi usare solo i collegamenti. Il modo più veloce che ho trovato per iniettare un parametro era con javascript. Non è l'ideale, ma funziona:

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

tuo pulsante può assomigliare a questo:

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