2012-07-20 13 views
6

mają toruble za pomocą przycisku, który ma akcję. Mam kilka pakietów, które chcę poznać. W Grails samouczek mówi powinno być tak:jak przekazywać paramy za pomocą przycisku akcji w grailsach

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

Próbowałem za pomocą remotelink, submitButton, tagi submitToRemote ale żaden działa. Zawsze uzyskuję wartość zerową, gdy próbuję analizować ją w kontrolerze:

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

Czego mi brakuje? czy mój kod paramów jest zły? Czy mój kod w analizie parametrów jest nieprawidłowy? to tylko wprowadza mnie w kółko bez postępu. Wsparcie. dzięki.

+0

Czy próbowałeś ** **. Może zapomniałem {} o atrybucie params, jeśli to nie działa, spróbuj umieścić je jak ** [{}] ** lub ** {[]} ** Nie pamiętam teraz, jak to było. Sry – axierjhtjz

Odpowiedz

7

Numer Grails documentation nie jest wymieniony jako params jako jeden z atrybutów akceptowanych przez actionSubmit.

To jest można wstrzykiwać żądaną wartość w liście params w kontrolerze poprzez wykorzystanie co to tag faktycznie robi:

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

Możesz też po prostu chcą tylko kod całkowicie oddzielne logika w działaniach editPhone i editEmail, jeśli dzięki temu twój kod stanie się czystszy.

Updated Zobacz Kod:

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

Atrybut params jest analizowany jako mapa, gdzie klucze są traktował ciągi ale wartościsą traktowane jako wyrażenia. Dlatego

params="['actionTaken':editPhone]" 

próbuje określić klucz o nazwie actionTaken mieć wartość od zmiennej o nazwie editPhone w modelu GSP. Ponieważ nie ma takiej zmiennej, otrzymujesz zero. Tak więc poprawka polega na przesunięciu cytatów:

params="[actionTaken:'editPhone']" 

który ustawi wartość na ciąg "editPhone".

+2

Właściwie zrobiłem to już przed opublikowaniem tutaj i nadal mam zerową wartość. :( – user742102

+0

To nie działa dla grails 2.0 –

0

prostu miałem podobny problem (Musiałem złożyć usuwać wraz z identyfikatorem) i znalazł rozwiązanie za pomocą atrybutu "formaction" HTML5 dla submit-wejściami. Można im nadać wartość, która może zawierać kontroler, akcję, dodatkowe parametry itp.

Ogólnie rzecz biorąc, aby dodać parametr do przycisku przesyłania, taki jak edycja określonego pod-obiektu w formularzu będzie wyglądać tak:

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

iw swoim przykładzie:

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

można też przekazać parametr wewnątrz pO danych przy użyciu

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

wewnątrz formularza. Następnie jest również dostępny poprzez zmienną params. To działa dla mnie.

+0

To jest poprawna odpowiedź imho. Musisz pamiętać, że kontekst jest w formularzu i że formularz zostanie przesłany do akcji wymienionej w znacznik . – nby

0

W mojej sytuacji miałem jeden element formularza z wieloma akcjami w każdym wierszu tabeli (tj. Przyciski edycji tabeli danych). Ważne było, aby wysłać całe dane formularza, więc nie mogłem po prostu użyć linków. Najszybszym sposobem na wprowadzenie parametru był javascript. Nie jest idealny, ale to działa:

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

Twój przycisk może wyglądać następująco:

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