2017-11-07 3 views
1

Ich versuche, mitForm in Grails 2.2.4 zu verwenden Ich habe UseToken = 'True' zu einem Formular in einer vorhandenen Gsp-Datei hinzugefügt.WithForm nicht übergeben Modelldaten zu gsp mit Grails 2.2.4

Wenn ich jedoch die zugeordnete Controller-Methode mit einem withForm {...} .invalidToken {response.status = 405} umbrechen, erhalte ich interne Serverfehler, da die Generierung von gsp fehlschlägt, da keines der Attribute aus dem Modell empfangen wird .

Um dies zu zeigen, habe ich den echten Rendercode durch einige einfache Anweisungen ersetzt, die die Werte für die übergebenen Modellattribute ausgeben.

Wenn ich nicht den withForm-Wrapper verwenden, dann funktioniert alles gut. Sobald aber die withForm um den Inhalt gewickelt ist, kommt die Modellinformation nicht mehr durch.

Irgendwelche Ideen, was ich falsch mache? Soll das Modell unterhalb der withForm-Syntax platziert werden?

Steuercode:

def browse() { 
//  withForm { 
    def filter = null  
    def challenges = [] 
    def oimlChallenges = [] 
    def breadCrumbs 
    def total 
    def model = SystemUtil.baseModel(request) 
    def Boolean enablePartnerChallenge 
    def currentUser = springSecurityService?.currentUser 
    def source = params.source ?: 'innocentive' 
    model += [enablePartnerChallenge: enablePartnerChallenge, max: params.max ?: 10,] 
    filter = ChallengeFilter.build(params, sswcEnabled()) 
    model += [challenges: challenges, 
       filter: filter, total: total, sort: 'postedDate', 
       currentOffset: params.offset, source: source, 
       searchTerm: params.searchTerm, 
       userFilter: userFilter()] 

    render(view: 'browse', model: model) 
//  }.invalidToken{ response.status = 405} 
} 

gsp Code:

<body> 
    <g:render template="/panels/headerUX" 
    model="[selectedMenu: 'Challenge Center']" /> 
    <div class="body-container"> 
    <div class="container"> 
     <g:form name='filterForm' action="browse" id='filterForm' 
      method="post" useToken="true"> 

     browse.gsp values: 
     ${source.toString()} 
     ${pavilionId.toString()} 
     ${enablePartnerChallenge} 
     ${challengeListing.toString()} 
     ${pavilionTitle} 


<%--    <g:render template='browseTabsRefresh' model="${[source: source, pavilionId: pavilionId, enablePartnerChallenge: enablePartnerChallenge, challengeListing: challengeListing, pavilionTitle: pavilionTitle]}" />--%> 
<%--    <g:render template="newFilterPanel" model="${model}" />--%> 
<%--    <div id="challengeListDiv">--%> 
<%--     <g:render template='challengeListRefresh'--%> 
<%--      model="${[challenges:challenges, filter:filter, userFilter: userFilter, challengeListing:challengeListing]}" />--%> 
<%--    </div>--%> 

     </g:form> 
    </div> 
</div> 

<g:render template="/panels/footerUX" /> 

Die Druckergebnisse ohne withForm: browse.gsp Werte: InnoCentive null null

Die gedruckten Resultate mit withForm: browse.gsp Werte: null null null

Beachten Sie, dass das Original den Wert 'unschuldig' enthielt und jetzt als null angezeigt wird.

Antwort

1

Wird der GSP-Code für browse.gsp angezeigt? Es scheint, als ob Sie auf Ihre browse Methode zugreifen, ohne Ihr Formular tatsächlich zu senden. Wenn Sie das Formular nicht senden, wird nur der invalidToken-Teil ausgeführt und es wird versucht, Ihr browse.gsp danach zu rendern (da Sie nur den HTTP-Antwortcode ändern, aber Text oder eine andere .gsp nicht umleiten oder rendern).

Um zu überprüfen, ersetzen Sie invalidToken Block mit so etwas wie die folgenden, damit es nicht den .gsp

}.invalidToken{ 
      render(status: 405, text: "Invalid Token") 
} 

Für Ihre reale Implementierung versucht und macht, werden Sie auf eine Fehlerseite umleiten mögen oder sowas ähnliches.

+1

Ja, das Problem war das Missverhältnis zwischen der Form und der Methode. Ich hatte zufällig ein Formular ausgewählt, um mein erstes Update durchzuführen. Leider verhält sich der von mir ausgewählte ungewöhnlich und die Methode verarbeitet mit oder ohne Formulardaten. Da es funktionierte, kam mir nicht in den Sinn, dass es ein Problem wäre. Als ich ein Standardformular, das den Konventionen folgte, aktualisiert hatte, funktionierte die withForm gut. Danke für diese klare Erklärung! –