Comment lier des données à un objet de commande qui a une propriété imbriquée? (objet non domaine)
-
14-11-2019 - |
Question
J'essaie de lier certaines données à un objet qui fait partie d'un objet de commande. L'objet reste nul lorsque vous essayez de l'utiliser. Je ne donne probablement pas les données correctes dans le GSP, mais je n'ai aucune idée de ce que je fais de mal!
Je m'attendrais à ce que lorsque je soumet un formulaire avec un nom de champ 'book.title' Cela serait mappé dans l'objet de commande .. mais cela échoue .. le titre reste [null
Chaque fois que je change l'objet de commande et le formulaire pour utiliser le titre de chaîne comme propriété, il fonctionne.
// the form that submits the data
<g:form>
<g:textField name="book.title" value="Lord Of the Rings"/><br>
<br><br>
<g:actionSubmit action="create" value="Create!"/>
</g:form>
// the controller code
def create = { BooksBindingCommand cmd ->
println cmd?.book?.title // the book property always stays null
redirect(action: "index")
}
// the command object
class BooksBindingCommand {
Book book
}
// the book class, simple plain groovy class
class Book {
String title
}
Une suggestion sur la raison pour laquelle la liaison de «book.title» échoue?
La solution
Essayez de l'initialiser avant de se lier, comme:
// the command object
class BooksBindingCommand {
Book book = new Book()
}
Autres conseils
Juste un coup rapide.
Le nom du champ de formulaire doit probablement être book_title plutôt que d'utiliser une période (je ne sais pas si cela devient un problème lorsqu'il est géré dans le contrôleur).
<g:textField name="book_title" value="Lord Of the Rings"/><br>
Dans votre contrôleur, créez d'abord votre modèle de livre, puis attribuez-le à la classe que vous souhaitez être liée.
def create = {
def mybook = new Book()
mybook.title = params.book_title
def binder = new BooksBindingCommand()
binder.book = mybook
}
Le BooksbindingCommand est-il un modèle? Parce que je ne sais pas ce que vous essayez de réaliser.