变量在 GSP 标签中不起作用,但在普通文本中起作用
Posted
技术标签:
【中文标题】变量在 GSP 标签中不起作用,但在普通文本中起作用【英文标题】:Variable not working in a GSP Tag, but working in normal Text 【发布时间】:2011-08-15 10:33:45 【问题描述】:我想让登录的用户可以通过快速链接编辑他的用户帐户。
为此,我使用正确的 GSP 标签创建了一个链接,并且我想使用正确的 Helper 从 Spring Security UserDetails 对象传递用户 ID。
问题在于,当我在 GSP 标记中时,例如在编辑我的用户之后,但不是在我真正需要的地方,在 id 属性中,这有效。
<g:link controller="user" action="show" id="$sec.loggedInUserInfo(field: "id")">
Edit my User $sec.loggedInUserInfo(field: "id")
</g:link>
预期:
<a href="/Backoffice/user/show/1"> Edit my User 1 </a>
错误的结果:
<a href="/Backoffice/user/show"> Edit my User 1 </a>
安全标签库正在访问的 UserDetails 类在这里:
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
import org.springframework.security.core.GrantedAuthority
class UserDetails extends GrailsUser
final String displayName
final String email
final String gravatarImage
...
id 在 GrailsUser 基类中定义为 Object。
类 GrailsUser 扩展用户
private final Object _id
...
并且会在此处编码为 html:
/**
* Renders a property (specified by the 'field' attribute) from the principal.
*
* @attr field REQUIRED the field name
*/
def loggedInUserInfo = attrs, body ->
// TODO support 'var' and 'scope' and set the result instead of writing it
String field = assertAttribute('field', attrs, 'loggedInUserInfo')
def source
if (springSecurityService.isLoggedIn())
source = determineSource()
for (pathElement in field.split('\\.'))
source = source."$pathElement"
if (source == null)
break
if (source)
out << source.encodeAsHTML()
else
out << body()
有趣的是:这行得通。但我真的很想对链接使用一致的 gsp 语法,我想了解为什么上面发布的代码不起作用。
<a href="$createLink( controller : "user", action : "show", id : sec.loggedInUserInfo(field: "id"))">Edit my User</a>
【问题讨论】:
【参考方案1】:看起来引用错误 - 您需要在 id="..."
内转义 "
。为简单起见,请尝试使用field: 'id'
而不是field: "id"
。
【讨论】:
非常感谢,成功了。有趣的是,IDEA 没有显示明显的错误... 我用 Grails 向 IDEA 报告了一大堆错误 - 它们很快就被修复了。【参考方案2】:您需要将 id 作为参数传递,您只是将 id 分配给您的链接..
<g:link controller="user" action="show" params="[id:$sec.loggedInUserInfo(field: "id")]" id="$sec.loggedInUserInfo(field: "id")">
Edit my User $sec.loggedInUserInfo(field: "id")
</g:link>
使用firebug 查看 g:link 的准确呈现的 html...
【讨论】:
以上是关于变量在 GSP 标签中不起作用,但在普通文本中起作用的主要内容,如果未能解决你的问题,请参考以下文章
PlayFunction 在 DLL 中不起作用,但在独立 exe 中起作用 [重复]
Tableview 文本字段中的 iOS 在 for 循环中获取值在 ios 7 中不起作用,但在 iOS 8 中起作用
量角器点击在 IE 中不起作用,但在 chrome 中起作用
ajax 跨源请求在 safari 中不起作用,但在 chrome 和 firefox 中起作用