Grails 3.3中自定义select标签:关联对象显示名称而非ID
解决Grails 3.3中Product创建视图显示Client姓名而非ID的问题
这个问题我之前也碰到过,Grails默认的g:select标签确实会用Domain类的默认toString()方法来渲染选项文本,而默认的toString()就是类名加ID,所以才会只显示Client的ID。下面给你两种实用的解决方法:
方法一:重写Client类的toString()方法(最简便)
直接在你的Client领域类里添加toString()方法,返回你想要显示的姓名组合。这样不管哪里用到Client的下拉选择,都会自动显示姓名:
class Client { // 建议把类名改成大写开头,符合Groovy/Java命名规范 String firstName // 变量名也建议用小驼峰,更规范 String lastName static hasMany = [products: Product] @Override String toString() { "$firstName $lastName" // 拼接姓和名 } }
修改完之后重启应用,再打开Product的创建页面,下拉框里就会显示Client的姓名了。
方法二:在视图中自定义g:select的选项文本(无需修改Domain类)
如果你不想修改Client类的toString(),可以直接在Product的创建视图(product/create.gsp)里调整g:select标签的参数,指定optionValue来定义显示的内容:
找到原来的下拉框代码,大概是这样的:
<g:select bean="${product}" field="c" />
把它改成:
<g:select name="c.id" from="${Client.list()}" optionKey="id" optionValue="${{it.firstName + ' ' + it.lastName}}" value="${product?.c?.id}" />
这里解释一下参数:
name="c.id":对应Product类里的c属性,提交表单时会把选中的Client ID传给后台from="${Client.list()}":指定下拉选项的数据源,这里是所有的Client记录optionKey="id":指定选项的value值为Client的IDoptionValue="${{it.firstName + ' ' + it.lastName}}":指定选项显示的文本为Client的姓名组合value="${product?.c?.id}":如果是编辑页面,会默认选中当前关联的Client
另外提醒一下,你的领域类命名和变量名最好遵循Groovy的规范,比如类名Client(大写开头),变量名firstName、lastName(小驼峰),这样代码更易读,也能避免一些潜在的问题。
内容的提问来源于stack exchange,提问作者The NinoX
相关产品推荐
相关产品推荐

