我正在使用Grails框架。在我的用户控制器中,我有一个名为“active”的布尔字段,它控制是否允许用户登录。登录操作在用户登录时检查此值。
我的域名:
class User {
Boolean active
}
我的观点(edit.gsp):
<g:select id="active" name="active" from="${[1,0]}" value="${userInstance?.active}" />
该值正确保存到数据库中,但我希望“帐户状态”下拉列表显示“已启用”或“已禁用”,而不是现在的“1”或“0”。
它还应该在加载编辑页面时显示当前值。目前,即使用户在数据库中的值为“0”,它也始终显示“1”的值。
这看起来很容易,但是我还没有找到任何人在GSP中设置下拉值的例子,到目前为止我没有尝试过任何事情。谢谢!
答案 0 :(得分:11)
我看到两个解决方案,in the documentation。
一个是标签的keys
参数:
<g:select id="active" name="active" from="${['Enabled','Disabled']}" keys="${[1,0]}" value="${userInstance?.active}" />
这提供了不同的键列表与值列表。
另一个解决方案是使用optionKey
和/或optionValue
参数,但这将要求列表包含可用于查找值的对象或类似内容:< / p>
在src/groovy/BooleanSelectOption.groovy
:
class BooleanSelectOption {
String name
String value
private BooleanSelectOption(name, value) {
this.name = name
this.value = value
}
private static List _list;
public static List getList() {
if(!BooleanSelectOption._list) {
BooleanSelectOption._list = [new BooleanSelectOption('Enabled',1), new BooleanSelectOption('Disabled',2)]
}
BooleanSelectOption._list
}
public String toString() { name }
}
在您看来:
<g:select id="active" name="active" from="${BooleanSelectOption.list}" optionKey="value" value="${userInstance?.active}" />
现在标签正在根据列表中项目的bean属性查找密钥。此外,enum
也可能适用于此。
显然,第一种技术对于短名单更为清晰,但我想为更复杂的情况展示两种选择。我还没有测试第二个例子。
还有一点需要注意:您可能会发现密钥0
和1
并不真正起作用,因为如果值为Disabled
将不会被选中(根据我的经验) false
。我不知道您是否可以使用true
和false
,但是您应该进行测试以确保获得预期效果。
实际上还有第三个选项,可能是最强大的解决方案,也在文档中:
使用valueMessagePrefix
参数允许从i18n消息中查找显示的值。
在grails-app/i18n/messages.groovy
:
boolean.select.0=Disabled
boolean.select.1=Enabled
在您看来:
<g:select id="active" name="active" from="${[1,0]}" value="${userInstance?.active}" valueMessagePrefix="boolean.select" />
如果您需要,还可以使用不同语言的不同标签。
答案 1 :(得分:4)
您可以使用optionKey
和optionValue
来使用对象属性或映射值作为键和值。尝试这样的事情:
<g:select name="active" optionKey="key" optionValue="value"
from="${[[key: 1, value: 'Enabled'],[key: 0, value: 'Disabled']]}"/>
答案 2 :(得分:1)
正如作为此类案例的替代方案,当出现时将涉及比任务保证更多的处理,记住你可以回退到普通的旧HTML。 E.g。
<select name="active">
<option value="0" ${!active ? 'selected' : ''}>Disabled</option>
<option value="1" ${active ? 'selected' : ''}>Enabled</option>
</select>