2014-10-23 3 views
1

У меня есть следующий POJO/ПЫЙ:Форматирование POJO внутри Grails/GSP выбора элемента

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> с [email protected] -оценивая значения как <option> с. Очевидно, что Grails не десериализует мои Person экземпляры в довольно печатную форму.

Я хочу, чтобы имена людей и фамилии людей отображались как варианты выбора. Таким образом, если один из Person экземпляров в people списке:

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

Тогда я бы ожидать «Smeeb McGuillocuty» как выбрать опцию в окончательном формате HTML. Как это сделать?

ответ

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: »поведение ..следующие по умолчанию является вызов toString() на каждый элемент атрибута from .. "

1

Если вы не можете/не будете жертвовать toString() для визуализации в HTML, вы также можете сообщить g:select как отобразить варианты. Либо путем предоставления имя свойства в optionValue (например optionValue="fullName", а затем обеспечить String getFullName() метод (следите за переходными процессами, если вы передаете объект GORM)) или путем предоставления его непосредственно в GSP:

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

Это странное отношение, но очень распространенное - зачем тратить формат toString для раскрывающегося списка html, когда вы можете сделать немного больше работы для настройки самого раскрывающегося списка. Это не то, о чем я говорю, но это кажется таким обратным. –

+0

@BurtBeckwith возможно, потому что вам когда-либо приходилось делать головы или хвосты от какого-то утверждения или debug-println? Или это может быть только я;) – cfrick

Смежные вопросы