【问题标题】:withForm not passing Model data to gsp using Grails 2.2.4withForm 不使用 Grails 2.2.4 将模型数据传递给 gsp
【发布时间】:2017-11-07 20:29:57
【问题描述】:

我正在尝试在 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 值:无辜 null null

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

请注意,原始包含值“innocentive”,现在它以 null 的形式出现。

【问题讨论】:

    标签: grails


    【解决方案1】:

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

    要验证,请将您的 invalidToken 块替换为以下内容,这样它就不会尝试渲染 .gsp

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

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

    【讨论】:

    • 是的,问题是表单和方法不匹配。我随机选择了一个表格来进行我的第一次更新。不幸的是,我选择的那个表现异常,并且该方法处理有或没有表单数据。由于它有效,我没有想到这会是一个问题。当我更新遵循约定的“标准”表单时, withForm 工作正常。谢谢你这么清楚的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多