【问题标题】:Grails Redirect being called but page is not being rendered调用 Grails 重定向但未呈现页面
【发布时间】:2012-11-01 21:43:23
【问题描述】:

朋友们下午好。

在过去的几天里,我一直在努力解决一个非常令人沮丧的问题,终于走到了尽头。我团队中的每个人似乎都没有时间解决这个问题,这让我发疯了!

无论如何,我有一个带有删除操作的控制器,当用户从 Bootstrap 模式对话框中确认删除时调用该操作。该操作被调用并且重定向语句在调试中被击中就好了。它甚至将 chrome 开发者工具中的调用显示为被调用!

但是,由于某种原因,页面永远不会重定向。我什至尝试在操作中没有其他代码的情况下明确重定向到 Google。我不知道这笔交易是什么。我会发布任何相关代码;如果您需要其他代码,请告诉我。

CatalogController.groovy

def delete = {
    def catalog = Catalog.get(params.id)
    if (catalog == null) {
        redirect(controller: 'home', action: 'dashboard')
        println "Catalog is null and cannot be Deleted"
        return
    }

    if (request.method == "POST") {
        //catalog.deleted = true TESTING UNTIL REDIRECT WORKS 
        if (catalog.validate()) {
            userService.addUserActivity("Deleted catalog " + catalog.title, catalog.class.getName(), catalog.id, null)
            flash.notice = "Catalog has been deleted"
            catalog.save()
            println "Catalog successfully deleted"
        }
        else {
            flash.error = "There was an error marking the catalog deleted"
        }

        redirect(controller: 'home', action: 'dashboard')
        return
    }

    [ catalog: catalog ]
}

引导模式标记

<div id="deleteDialog" class="modal hide fade" tabindex="-1" role="dialog"  aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal"
            aria-hidden="true">×</button>
        <h3 id="myModalLabel">Delete Catalog</h3>
    </div>
    <div class="modal-body">
        <p><strong>Are you sure you want to delete this Catalog?</strong></p>

        <div class="dialogInnerInfo">
            <div class="row-fluid control-group">
                <label class="control-label" for="catalogNumber">Catalog Number:</label>
                <div class="controls">
                    <label id="catalogNumber" >${catalog.legacyId}</label>
                    <input type="hidden" name="id" value="${catalog.id}"/>
                </div>
            </div>

            <div class="row-fluid control-group">
                <label class="control-label" for="catalogTitle">Catalog Title:</label>
                <div class="controls">
                    <label id="catalogTitle">${catalog.title}</label>
                </div>
            </div>

            <div class="row-fluid control-group">
                <label class="control-label" for="catalogTitle">Number of Samples:</label>
                <div class="controls">
                    <label id="catalogTitle">${catalog.sampleCount}</label>
                </div>
            </div>
        </div>
    </div>
    <div class="modal-footer">
            <g:remoteLink class="btn btn-primary" controller="catalog" action="delete" id="${catalog.id}" data-dismiss="modal">Yes</g:remoteLink>
            <button class="btn btn-primary" value="${catalog.id}" data-dismiss="modal" onclick="${remoteFunction(action:'delete', controller: 'catalog', params: '\'id=\'  + this.value')}">Click Here</button>
            <button class="btn" data-dismiss="modal" aria-hidden="true">No</button>
        </div>
    </div>

我尝试了各种不同的按钮(g:links、buttons、g:remoteLinks 等)并清理了删除操作。我还尝试删除我的浏览器缓存、grails 缓存、运行 grails-clean 和其他任务,以查看问题是否在我的环境中,但其他人也没有得到重定向。

请原谅丑陋的编码,一旦重定向工作,它将被清理。我也欢迎提出建议和改进:)

非常感谢您的时间和帮助!

【问题讨论】:

  • 您需要删除所有这些返回语句,您应该一切顺利。控制器中的最后一条语句需要是重定向或渲染(或仅使用模型映射的隐式渲染)。
  • 我认为他在调用重定向后使用return 来阻止后续代码执行。
  • 我试过删除 return 语句,但没有任何效果。 GalmWing 是正确的,因为返回是为了防止其余代码被击中。

标签: grails redirect twitter-bootstrap controller modal-dialog


【解决方案1】:

当前显示的版本无法工作,因为远程链接不会进行重定向,因为响应是从 JS 解析的。您需要在 JavaScript 中手动处理它或使用 g:link。

此外,您不能将data-dismiss="modal" 与链接结合使用,因为 twitter 引导程序会拦截您的点击并阻止任何进一步的服务器通信。如果您删除 data-dismiss="modal",它将起作用。

【讨论】:

  • g:link 也不会导致重定向。除非我的代码有误:
  • 您不能将data-dismiss="modal" 与链接结合使用,因为 twitter 引导程序会拦截您的点击并阻止任何进一步的服务器通信。如果您删除data-dismiss="modal",它将起作用。
  • 谢谢你,克鲁多夫!您的建议使我走上了正确的道路!这是使它正常工作的代码! &lt;div class="modal-footer"&gt; &lt;g:form action="delete" method="post" controller="catalog"&gt; &lt;g:hiddenField name="id" value="${catalog.id}"/&gt; &lt;g:actionSubmit class="btn btn-primary" value="Action" action="delete"&gt;&lt;/g:actionSubmit&gt; &lt;button class="btn" data-dismiss="modal" aria-hidden="true"&gt;No&lt;/button&gt; &lt;/g:form&gt; &lt;/div&gt; 其他按钮不起作用,因为它们正在渲染在幕后处理的 AJAX。难怪为什么它没有在浏览器中呈现...
猜你喜欢
  • 2021-01-08
  • 2019-03-09
  • 2021-01-20
  • 2016-02-28
  • 2018-02-12
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多