将参数传递给所有视图

时间:2013-04-21 18:56:20

标签: variables groovy playframework playframework-1.x

我有一个播放应用程序(Play 1.2.4)。在我的应用程序的每个页面中,我想要访问登录用户(使用groovy)。所以我可以执行权限检查等。我试图将它放在doLayout

之前的主模板中
#{set user:user/}

我可以在我的应用程序的主页面中访问该用户,但在浏览其他页面的链接时,我无法再访问该用户变量。

1 个答案:

答案 0 :(得分:1)

我认为您对在Play!Framework上使用#{set}#{get}标记有误解。查看#{set}#{get}标记上的文档。

我举个例子,你有三个模板如下:

main.html中

<html>
   <head>
       <title>#{get 'title' /}</title>
   </head>
   <body>
       #{doLayout /}
   </body>
</html>  

template1.html

#{extends 'main.html' /}
#{set title:header /}

<p>This is template1.html page</p>

template2.html

#{extends 'main.html' /}
#{set title:header /}

<p>This is template2.html page</p>

控制器上的方法如下:

public static void template1() {
    String header = "Template 1 Title"
    render(header);
}

public static void template2() {
    render();
}

这是解释,当您呈现template1.html时,您可能会注意到我们在header中设置了页面标题(使用template1.html变量)。我们设置的标题是使用main.html上的#{get}main.html上检索的。

然后在渲染template2.html时查看,您可能会注意到我们也设置了页面标题。但区别在于控制器(在template2()方法上),您尚未将header变量值传递给模板。因此,虽然您已设置标题,但标题具有空值,并且在您呈现template2.html时未设置标题的含义。

因此,对于您的问题,我认为当您坚持将#{set user:user /}放在模板上并希望访问user变量时,您必须在所有控制器上传递user变量方法在渲染模板之前。呃..效率太低了!


  

建议

     

我建议您使用session来存储用户数据,例如userid,因为它可以在所有应用模板中访问!请查看文档here

希望这可以让你理解机制,并且会这样