withForm没有使用Grails 2.2.4将模型数据传递给gsp

时间:2017-11-07 20:29:58

标签: grails

我试图在Grails 2.2.4中使用withForm  我已将useToken ='true'添加到现有gsp文件的表单中。

但是,当我使用withForm {...} .invalidToken {response.status = 405}包装关联的控制器方法时,我收到内部服务器错误,因为gsp生成失败,因为没有收到模型中的任何属性。

为了说明这一点,我用一些简单的语句替换了真实的渲染代码,这些语句打印出传入的模型属性的值。

如果我不使用withForm包装器,那么一切正常。但是只要withForm包含内容,模型信息就不再存在。

任何想法我做错了什么?该模型应该放在withForm语法下面吗?

控制器代码:

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代码:

<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" />

没有withForm的打印结果: browse.gsp values:innocentive null null

使用withForm打印的结果: browse.gsp values:null null null

请注意,原始文件包含值'innocentive',现在它以null形式出现。

1 个答案:

答案 0 :(得分:1)

是否为browse.gsp显示了GSP代码?您似乎在没有实际提交表单的情况下访问browse方法。除非您提交表单,否则只会执行invalidToken部分,之后会尝试呈现您的browse.gsp(因为您只是更改HTTP响应代码,但不会重定向或呈现文本或不同的.gsp)

要验证,请使用以下内容替换您的invalidToken块,以便它不会尝试渲染.gsp

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

对于您的实际实现,您需要重定向到错误页面或类似的东西。