在Grails中将模型变量传递给布局的最佳方法是什么?具体来说,我正在使用具有User类的Spring安全插件。我也有Contact类,如下所示:
class Contact {
String realname
String company
String mobile
String fix
String email
User user
...
在我的布局(main.gsp)中获取当前登录人员公司的选项有哪些?
答案 0 :(得分:1)
你的意思是你需要自动地为每个页面传递这个模型,而不是在每个控制器的渲染时手动传递它吗?您可以在那里使用filters:
def filters = {
all(controller: '*', action: '*') {
before = {
request.setAttribute('loggedInPerson', SecurityContextHolder.context.authentication?.principal)
//Notice, that there is used original Authentication, from Spring Security
//If you need you can load your Contact object there, or something
}
after = {
}
afterView = {
}
}
}
并在你的gsp上使用loggedInPerson
:
Hello ${loggedInPerson.username}!
顺便说一句,还有Spring Security tags,可以帮助您而不使用自己的过滤器,例如:
Hello <sec:loggedInUserInfo field="username"/>!
答案 1 :(得分:1)
要添加上述答案,您可以在登录任何控制器方法时为用户设置会话变量。
您也可以在控制器方法中为公司设置会话变量:
session.company = Contact.findByUser(session.user)?.company
或来自上面的例子
session.company = Contact.findByUser(SecurityContextHolder.context.authentication?.principal)?.company
在你的main.gsp中,例如:
<span id="companyName">${session.company}</span>
答案 2 :(得分:0)
如果要将某个对象添加到模型中,还可以使用grails提供的“拦截器”。要将特定变量添加到特定控制器,您可以使用类似的内容。
def afterInterceptor = {model, modelAndView->
model.loggedInUser = getLoggedInUser() // retrieve your user details here
}
您可以在main.gsp布局中将loggedInUser
检索为${loggedInUser}
。
如果您需要在多个控制器中获取这些详细信息,可以创建BaseController
并将afterInterceptor
保留在此BaseController
中。需要在相应视图中引用登录用户的所有控制器都应扩展BaseController
。