我试图在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形式出现。
答案 0 :(得分:1)
是否为browse.gsp显示了GSP代码?您似乎在没有实际提交表单的情况下访问browse
方法。除非您提交表单,否则只会执行invalidToken
部分,之后会尝试呈现您的browse.gsp(因为您只是更改HTTP响应代码,但不会重定向或呈现文本或不同的.gsp)
要验证,请使用以下内容替换您的invalidToken
块,以便它不会尝试渲染.gsp
}.invalidToken{
render(status: 405, text: "Invalid Token")
}
对于您的实际实现,您需要重定向到错误页面或类似的东西。