【问题标题】:Grails setting values in Select (dropdown menu) for a booleanGrails 在选择(下拉菜单)中为布尔值设置值
【发布时间】:2012-06-14 18:20:44
【问题描述】:

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

我的域名:

class User {
  Boolean active
}

我的观点(edit.gsp):

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

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

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

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

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    我看到了两种解决方案,都是in the documentation。

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

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

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


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

    在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 并没有真正起作用,因为如果值为 false,Disabled 将不会被选中(根据我的经验)。我不知道你是否可以使用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" />
    

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

    【讨论】:

    • 我在我的代码中使用了第一种方法,现在你指出了我更喜欢第三种方法。
    • 同意,valueMessagePrefix 的第三种方式看起来很不错。
    • 我今天一定是瞎了眼。我一遍又一遍地查看文档,并没有注意到键行。非常感谢你。我必须将其设置为 keys="${[true,false]}" 才能正确显示该值,因此我的经验与您的经验相符。第三种方式很有趣。我也会玩弄它。
    【解决方案2】:

    您可以使用optionKey 和optionValue 为键和值使用对象属性或映射值。试试这样的:

    <g:select name="active" optionKey="key" optionValue="value"
     from="${[[key: 1, value: 'Enabled'],[key: 0, value: 'Disabled']]}"/>
    

    【讨论】:

    • 这是一个很好的答案,值得赞赏
    【解决方案3】:

    作为这种情况的替代方案,当涉及的处理量比任务保证的多得多时,请记住,您可以回退到普通的旧 html。例如

    <select name="active">
     <option value="0" ${!active ? 'selected' : ''}>Disabled</option>
     <option value="1" ${active ? 'selected' : ''}>Enabled</option>
    </select>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2013-07-22
      相关资源
      最近更新 更多