在Grails / GSP select元素中格式化POJO

时间:2014-10-23 16:46:17

标签: grails model-view-controller groovy grails-controller

我有以下POJO / POGO:

class Person {
    String firstName
    String lastName
    int age
    // ... lots of other fields
}

Grails 2.3.6控制器:

class PeopleController {
    List<Person> people = new ArrayList<Person>()

    def populatePeople() {
        // Add lots of people to the 'people' list.
    }

    def doSomething() {
        populatePeople()

        render(
            view: "people", 
            model:[
                people: people,
            ]
        )
    }
}

然后在GSP中:

<div id="peopleSelector">
    <g:select name="people" from="${people}" />
</div>

当我运行我的应用时,我会使用<select>获取com.me.myapp.domain.Person@398r4d99元素 - 将值视为<option> s。这显然是Grails没有将我的Person实例反序列化为漂亮的打印格式。

我想要人们&#39;名字和姓氏显示为选择选项。因此,如果Person列表中的people个实例之一是:

Person smeeb = new Person(firstName: "Smeeb", lastNname: "McGuillocuty")

然后我会期待&#34; Smeeb McGuillocuty &#34;作为最终HTML中的选择选项。 我该如何做到这一点?

2 个答案:

答案 0 :(得分:2)

将以下方法添加到Person班级:

@Override public String toString() {
    "$firstName $lastName"
}

并且,与实际问题有些无关,您可能必须在您的选项行中添加标识符以唯一标识该人。假设Person类具有id属性:

<g:select name="people" from="${people}" optionKey="id" />

以便获得以下HTML:

<select name="people" id="people">
    <option value="123">Smeeb McGuillocuty</option>
    :

官方文档的有用链接:http://grails.org/doc/latest/ref/Tags/select.html: &#34; ..默认行为是对toString()属性中的每个元素调用from。&#34;

答案 1 :(得分:1)

如果你不能/不会牺牲&#34; toString()用于在HTML中呈现,您还可以告诉g:select如何呈现选项。通过在optionValue中提供属性的名称(例如optionValue="fullName",然后提供String getFullName()方法(注意瞬态,如果您传递GORM对象))或直接提供在GSP中:

<g:select name="person" optionKey="theId" optionValue='${{"$it.lastName, $it.firstName"}}' from="${people}" />