Grails Fields Plugin:如何从自定义模板访问f:display标签的bean
解决Grails <f:display>关联实体友好文本渲染问题
方案一:自定义专属display标签库
直接编写自定义标签,针对性覆盖关联字段的渲染逻辑,不干扰原有标签的其他行为:
在grails-app/taglib目录下创建CustomDisplayTagLib.groovy:
class CustomDisplayTagLib { static namespace = 'custom' def display = { attrs -> def bean = attrs.bean def property = attrs.property // 无bean或property参数时直接调用默认display标签 if (!bean || !property) { out << g.display(attrs) return } def value = bean[property] // 检查关联实体是否存在name属性 if (value && value.hasProperty('name')) { // 渲染带name文本的详情页链接 out << g.link(controller: value.class.simpleName.toLowerCase(), action: 'show', id: value.id) { value.name } } else { // 无name属性时回退到默认display行为 out << g.display(attrs) } } }
使用时替换原标签即可:
<custom:display bean="${someBean}" property="parent"/>
方案二:重写默认字段渲染模板(无需修改标签调用)
Grails的<f:display>内部会调用通用字段渲染模板,直接修改该模板可实现全局生效:
在grails-app/views/templates目录下创建_field.gsp(若已有则修改对应关联字段渲染块),将关联字段的渲染逻辑替换为:
<g:if test="${value != null}"> <g:if test="${value.hasProperty('name')}"> <g:link controller="${propertyType.simpleName.toLowerCase()}" action="show" id="${value.id}">${value.name}</g:link> </g:if> <g:else> <g:link controller="${propertyType.simpleName.toLowerCase()}" action="show" id="${value.id}">${value}</g:link> </g:else> </g:if>
修改后原有的<f:display bean="${someBean}"/>会自动应用新逻辑:关联字段优先显示name值,无name属性时回退到默认toString输出,全程无需修改领域类的toString方法,不影响日志场景的ID输出需求。
内容的提问来源于stack exchange,提问作者Bioman
相关产品推荐
相关产品推荐

