4

我正在使用 Grails 框架。在我的用户控制器中,我有一个名为“活动”的布尔字段,它控制是否允许用户登录。登录操作会在用户登录时检查此值。

我的域名:

class User {
  Boolean active
}

我的观点(edit.gsp):

<g:select id="active" name="active" from="${[1,0]}" value="${userInstance?.active}" />

该值正确保存到数据库中,但我希望帐户状态下拉菜单显示“已启用”或“已禁用”,而不是像现在那样显示“1”或“0”。

它还应该在加载编辑页面时显示当前值。目前,它始终显示“1”的值,即使用户在数据库中具有“0”的值。

这似乎很容易,但我无法找到任何人在 GSP 中设置其下拉值的示例,而且到目前为止我没有尝试过任何工作。谢谢!

4

3 回答 3

11

我在文档中看到了两种解决方案。

一个是给我们keys标签的参数:

<g:select id="active" name="active" from="${['Enabled','Disabled']}" keys="${[1,0]}" value="${userInstance?.active}" />

这提供了不同的键列表与值列表。


另一种解决方案是使用optionKeyand/oroptionValue参数,但这将要求列表包含对象或可用于查找值的类似内容:

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也可能在这里工作。


显然,第一种技术对于短列表来说更简洁,但我想在更复杂的情况下展示这两种选择。我也没有测试第二个例子。

还有一点需要注意:您可能会发现这些键01没有真正起作用,因为Disabled如果值为 . 则不会被选中(根据我的经验)false。我不知道你是否可以使用trueand 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" />

如果您需要,这还有一个额外的好处,即允许您为不同的语言使用不同的标签。

于 2012-06-14T19:24:57.733 回答
4

您可以为键和值使用optionKeyoptionValue使用对象属性或映射值。尝试这样的事情:

<g:select name="active" optionKey="key" optionValue="value"
 from="${[[key: 1, value: 'Enabled'],[key: 0, value: 'Disabled']]}"/>
于 2012-06-14T19:25:55.023 回答
1

就像这种情况下的替代方案一样,当出现比任务保证更多的处理时,记住你可以回退到普通的旧 html。例如

<select name="active">
 <option value="0" ${!active ? 'selected' : ''}>Disabled</option>
 <option value="1" ${active ? 'selected' : ''}>Enabled</option>
</select>
于 2012-06-15T14:06:03.550 回答