Grails 圣杯:<;g:选择

Grails 圣杯:<;g:选择,grails,Grails,我如何实现以下目标: 我的域中存储了一个布尔值,默认情况下Grails会创建一个复选框作为控件。我想要一个值为:Active/Inactive的select控件。 选择Active时,应传递值True 及 选择InActive时,应传递值False 我如何使用 <g:select name="status" from="" optionKey="" value="" /> 非常感谢。我不知道这是否是最好的方法,但您可以使用enum来完成这项工作: public enum Se

我如何实现以下目标:

我的域中存储了一个布尔值,默认情况下Grails会创建一个复选框作为控件。我想要一个值为:Active/Inactive的select控件。 选择
Active
时,应传递值
True
及 选择
InActive
时,应传递值
False

我如何使用
<g:select name="status" from="" optionKey="" value=""  />


非常感谢。

我不知道这是否是最好的方法,但您可以使用enum来完成这项工作:

public enum SelectOptions{
    ACTIVE(true, 'Active'),
    INACTIVE(false, 'InActive')

    Boolean optionValue
    String name

    SelectOptions(boolean optionValue, String name){
        this.optionValue = optionValue
        this.name = name
    }

    static getByName(String name){
        for(SelectOptions so : SelectOptions.values()){
            if(so.name.equals(name)){
                return so;
            }
        }
        return null;
    }

    static list(){
        [ACTIVE, INACTIVE]
    }

    public String toString(){
        return name
    }
}
将SelectOptions枚举的实例添加到域中:

class MyDomain {
    SelectOptions selectOptions = SelectOptions.ACTIVE
    //Other properties go here

    static constraints = {
        selectOptions(inList:SelectOptions.list())
        //other constraints
    }
}
那么在你的普惠制观点中:

<g:select
    name="status"
    from="${myDomainInstance.constraints.selectOptions.inList}"
    value="${myDomainInstance.selectOptions}" />

好吧,经过一番头脑风暴,我终于想出来了

我的代码更简单,如下所示:

package exproj.masters

 public enum ExamDurationTypes{
    FULL_EXAM(1, 'For Whole Exam'),
    PER_QUESTION(2, 'Per Question')

    Integer optionValue
    String name

    ExamDurationTypes(Integer optionValue, String name){
        this.optionValue = optionValue
        this.name = name
    }

    static getByName(String name){
        for(ExamDurationTypes edt : ExamDurationTypes.values()){
            if(edt.name.equals(name)){
                return edt;
            }
        }
        return null;
    }
    static list(){
        [FULL_EXAM, PER_QUESTION]
    }

    public String toString(){
        return optionValue
    }

}
然后我把它添加到我的域类中

class Exam {
.
.
.

Integer durationType

    static constraints = {
        durationType(inList: ExamDurationTypes.list())
    }   

}
在我的普惠制页面上,我这样破解了它

<g:select
name="durationType"
from="${exproj.masters.ExamDurationTypes.values()*.getName()}"
keys="${exproj.masters.ExamDurationTypes.values()*.getOptionValue()}"
value="${examInstance.durationType}" />

最终产生以下结果:

<select name="durationType" id="durationType">
<option value="1">For Whole Exam</option>
<option value="2">Per Question</option>
</select>

全考
每个问题

享受编码的乐趣

感谢Cesar的回复,但是当我单击“创建”时,出现以下错误,无法将java.lang.String类型的属性值转换为所需的com.myCompany.SelectOptions类型以获取属性状态;嵌套异常为java.lang.IllegalStateException:无法将[java.lang.String]类型的值转换为属性状态所需的[com.myCompany.SelectOptions]类型:找不到匹配的编辑器或转换策略是的,问题主要是从GSP提交字符串,但域对象需要枚举。我编辑了我的答案以反映这一点。请注意,使用这种技术,您最终会得到一个值为“Acive”或“Inactive”的varchar,而不是数据库中的一个值。请注意,对于未来的互联网用户,这种方法很难看。它将表示问题与模型逻辑结合起来,这一点都不好。最好通过直接修改视图来处理,而不是在默认值不够的情况下依靠脚手架。
<select name="durationType" id="durationType">
<option value="1">For Whole Exam</option>
<option value="2">Per Question</option>
</select>