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:
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. getDescription()
dans votre classe IModel
personnalisée qui interrogera la Map
pour la description d’un Integer
. 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.