2012-03-23 2 views
1

Играла с этим пару часов и, похоже, не могла окунуться в нее.Калитка: Избегайте назначения модели ListChoice модели формы

В Wicket список выбора принимает список моделей, которые будут представлять собой выбор, который составляет список. Когда отправляется форма, в которую добавлен список выбора, Wicket связывает модель выбранного выбора с моделью Формы.

Но что, если я не хочу, чтобы вся модель привязалась и вместо этого была специфическим свойством?

Например:

public class FormModel { 
     private int locationId; 

     public void setLocationId(int id) { 
      this.locationId = id; 
     } 
    } 

    public class LocationModel { 
     private int id; 

     public int getId() { 
      return this.id; 
     } 
    } 

    <select wicket:id="LocationId" id="LocationId" name="LocationId" size="1"> 
     <option value="#">#</option> 
    </select> 

Когда форма отправлена, калитка будет пытаться связать весь LocationModel к FormModel, где ясно я просто хочу, чтобы связать это locationId недвижимости.

Я уже пользуюсь ChoiceRenderer, но, похоже, работает только тогда, когда форма отображается не тогда, когда она отправлена.

Результатом является исключительное исключение класса, поскольку Wicket не сможет преобразовать LocationModel в целое число.

Мне бы очень хотелось создать другую модель специально для формы, чтобы принять LocationModel.

Любые мысли?

ответ

5

Объект модели DropDownChoice (выбранное значение) всегда является одним из объектов в списке выбора. Таким образом, невозможно предоставить список вариантов, в которых элементы имеют один тип, и сохранить выбор в DropDownChoiceModel в объекте другого типа (*).

Просто укажите List<Integer>. Если вы согласны с тем, что locationId - текст <option>, то IChoiceRenderer не нужен. В противном случае ваш IChoiceRenderer должен придумать описание с помощью locationId, например, с вызовом вспомогательной функции getDescriptionForLocationId(Integer locationId).

Если реализация этой getDescriptionForLocationId функции будет дорого, есть другой подход, вы можете использовать:

  1. Реализовать обычай IModel, который принимает Map<Integer, String> (или строит его во время getObject()), и в его getObject(), верните ключи от Map. Это предоставит список как выбор DropDownChoice.
  2. Внесите метод getDescription() в свой собственный класс IModel, который запросит Map для описания Integer.
  3. В IChoiceRenderer, получите модель DropDownChoice и позвоните по телефону getDescription(), чтобы получить правильное описание.

Вот небольшой пример: http://pastebin.com/DhKbsdQz

Пожалуйста, обратите внимание на недостатки этого подхода: Map получите сериализации вместе с Model (это также может быть расширение LoadableDetachableModel для эффективности)

(*) Думая об этом, Wicket использует equals() за кулисами, чтобы установить соответствие между ModelObject ddc и элементами в списке вариантов, поэтому у него есть свои логические вещи.

+0

Просто, чтобы убедиться, что я правильно понял; Вы говорите, что для выбора списка выбрали список целых чисел и внутри моего IChoiceRenderer, потяните соответствующее местоположение, представленное каждым идентификатором, когда оно отображается? – 9ee1

+0

Действительно. См. Мое редактирование для альтернативы, если вытаскивание описаний дорого. –

+0

Ваш пример отлично работал. Спасибо за подробный ответ. – 9ee1

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