Wicket: éviter d’atsortingbuer le modèle de ListChoice à un modèle de formulaire

J’ai joué avec ça pendant quelques heures et je n’arrive pas à comprendre.

Dans Wicket, un choix de liste prend une liste de modèles qui représenteront les choix qui composent la liste. Lorsque le formulaire auquel le choix de liste est ajouté est soumis, Wicket lie le modèle de choix sélectionné au modèle du formulaire.

Mais que se passe-t-il si je ne souhaite pas que l’ensemble du modèle soit lié à une propriété spécifique?

Par exemple:

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; } }  #  

Lorsque le formulaire est soumis, Wicket tentera de lier un LocationModel entier au FormModel, où je veux clairement lier sa propriété locationId .

J’utilise déjà un ChoiceRenderer mais cela ne semble fonctionner que lorsque le formulaire n’est pas rendu quand il est soumis.

Le résultat est une exception de conversion de classe ultime, car Wicket ne pourra pas convertir un LocationModel en un entier.

Je détesterais créer un autre modèle spécifiquement pour que le formulaire accepte un LocationModel.

Des pensées?

L’object Model d’un DropDownChoice (valeur choisie) est toujours l’un des objects de la liste des choix. Ainsi, il n’est pas possible de fournir une liste de choix dans quels éléments d’un type, et de stocker la sélection dans le Model DropDownChoice dans un object d’un type différent (*).

Fournissez simplement une List . Au cas où vous seriez d’accord avec ce locationId comme texte de , un IChoiceRenderer ne serait pas nécessaire. Sinon, votre IChoiceRenderer devrait IChoiceRenderer la description avec le IChoiceRenderer locationId , par exemple avec un appel à une fonction d’assistance getDescriptionForLocationId(Integer locationId) .

Si l’implémentation de cette fonction getDescriptionForLocationId serait coûteuse, vous pouvez utiliser une autre approche:

  1. Implémentez un object IModel personnalisé qui reçoit un object Map (ou le crée lors de getObject() ) et, dans son object getObject() , renvoie les clés de la Map . Cela fournira une liste comme choix de DropDownChoice.
  2. Implémentez une méthode getDescription() dans votre classe IModel personnalisée qui interrogera la Map pour la description d’un Integer .
  3. Dans IChoiceRenderer , récupérez le modèle de DropDownChoice et appelez son getDescription() pour obtenir la description appropriée.

Voici un petit exemple: http://pastebin.com/DhKbsdQz

Notez les inconvénients de cette approche: la Map sera sérialisée avec le Model (elle pourrait également être étendue avec LoadableDetachableModel pour plus d’efficacité)

(*) En y repensant, Wicket utilise des equals() arrière-plan pour établir la correspondance entre ModelObject du ddc et les éléments de la liste des choix, de sorte qu’il a sa logique.