【问题标题】:Grails Controller render view from layout folderGrails Controller 从布局文件夹渲染视图
【发布时间】:2014-05-06 14:30:45
【问题描述】:

我在我的应用程序中使用 spring security 和 twitter bootstrap。我有这个标题栏,其中包含用户名和密码字段以及登录按钮。当我单击登录按钮时,我会进行 ajax 调用以对用户进行身份验证。当这返回成功时,我创建第二个 ajax 调用来呈现不同的标题栏。两个标题栏都是我的布局文件夹中的部分视图的形式:

-Views
    - layouts
        - partials
            - _headerBasic.gsp
            - _headerUser.gsp
        - main.gsp
    - project

我的 ajax 调用是这样完成的:

<script type="text/javascript">
$(document).ready(function(){
    $("#LoginButton").click(function(){
        $.ajax({
            url: 'http://localhost:8080/XXXXX/j_spring_security_check',
            type: 'POST',
            data: {
                j_username: $("#username").val(),
                j_password: $("#password").val()
            },
            success: function(data){
                $.ajax({
                    url: 'http://localhost:8080/XXXXX/layout/renderNavBarLoggedIn',
                    type: 'POST',
                    success: function(data){
                        $("#navbar").empty();
                        $("#navbar").html(data);
                    },
                    error: function(errorThrown){
                        alert('Fail!1');
                    }
                });
            },
            error: function(errorThrown){
                alert('Fail!2');
            }
        });
        return false;
    });
});

而我的控制器就是这样的:

class LayoutController {
    def renderNavBarLoggedIn(){
        render ( view: "/views/layouts/partials/_headerUser" )
    }
}

我尝试过用视图代替模板:“/views/layouts/partials/headerUser”,但这仍然不起作用。

总而言之,我希望我的第二个 ajax 调用将我的顶部栏替换为部分视图。我该怎么做?

感谢您的所有帮助。

编辑:

需要注意的是,控制器的名称与视图文件夹的名称无关。

【问题讨论】:

  • 约定是用于站点网格布局的布局目录。我想你可以把任何你喜欢的东西放在那里,但是将它用于其他事情可能会在以后引起其他人的困惑。此外,您正在渲染 _headUser。通常 GSP 模板带有下划线前缀,而不是整个视图。也许你想要“render(template:'...')”而不是“render(view:'...')”。这不是这里真正的问题,但您可能希望将其视为单独的改进。我在单独的答案中描述了我认为真正的问题。我希望这会有所帮助。

标签: jquery ajax grails


【解决方案1】:

你可能想要这样的东西:

class LayoutController {
    def renderNavBarLoggedIn(){
        render ( view: "/layouts/partials/_headerUser" )
    }
}

请注意,我省略了路径的“视图”部分。 “views”是默认根目录,因此如果您指定“/views/...”,系统将查找“/views/views/...”。

【讨论】:

  • 谢谢你这样做。我将其更改为模板以适应下划线。
  • 出于我在另一条评论中引用的原因,我也会将其移出 layouts 目录。我很高兴你让它工作。
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多