我正在使用PlayFramwork和Java在Web应用程序中工作。 我正在尝试在主视图中实现一个简单的表单,但在此视图中我添加了不同的模板。当我将参数传递给视图时,我遇到了一些问题。 错误是:
类型不匹配;发现:play.data.Form.Field required:play.data.Form [models.Document]
让我解释一下代码。
showUserView.scala.html /主视图的内容
@(user: Form[User])
@import helper._
@import helper.twitterBootstrap._
@main("Test") {
<H1>SHOW USER</H1>
@newUserView(user)
@documentView(user("document"))
}
问题出在这一行:
@documentView(user("document"))
newUserView.scala.html /这个内容正常运行
@(user: Form[User])
@import helper._
@import helper.twitterBootstrap._
<H2>User's Form</H2>
@inputText(
user("name"),
'_label -> "Name: "
)
documentView.scala.html的内容/这就是问题...
@(doc: Form[Document])
@import helper._
@import helper.twitterBootstrap._
<H2>Document's Form</H2>
@inputText(
doc("number"),
'_label -> "Number: "
)
我正在准备视图以接收表单而不是字段...我不想更改参数的类型。我会保留原始模板。
有什么想法吗?如何将Field参数转换为Form [Document]?
答案 0 :(得分:1)
您需要在控制器中创建并填充两个模型,然后分别传递到主视图(showUserView.scala.html
):
@(userForm: Form[User], documentForm: Form[Document])
@import helper._
@import helper.twitterBootstrap._
@main("Test") {
<H1>SHOW USER</H1>
@newUserView(userForm)
@documentView(documentForm)
}
据我所知,您希望在已填充Document's
的上下文中编辑某些User
字段,在这种情况下,您应该只为一个子视图使用一个表单(用户),然后在您的操作中保存/更新数据通过隐藏ID找到相关文档:
@(userForm: Form[User])
@import helper._
@import helper.twitterBootstrap._
@main("Test") {
<H1>SHOW USER</H1>
@newUserView(userForm)
@documentView(userForm)
}
documentView.scala.html
中的
@(userForm: Form[User])
@import helper._
@import helper.twitterBootstrap._
<H2>Documents Form</H2>
<input type="hidden" name="document.id" value='@userForm("document.id").value' >
@inputText(
userForm("document.number"),
'_label -> "Number: "
)
因此,在保存用户时,您可以在请求中找到文档的ID和新编号,并使用这些数据更新文档:
public static result saveUserAndDoc(){
// save user as usually by binding the form...
Integer documentId = Integer.valueOf(form().bindFromRequest().get("document.id"));
Document document = Document.find.byId(documentId);
document.number = Integer.valueOf(form().bindFromRequest().get("document.number"));
document.update(documentId);
return ok("User saved with changed document number);
}
当然该示例不包含<form></form>
标记 - 只是字段 - 您需要添加适当的位置
答案 1 :(得分:1)
我将form参数更改为Field参数,结果是文档视图:
@(document : Field)
@import helper._
@import helper.twitterBootstrap._
<H2>Document type view!</H2>
@inputText(
document("number"),
'_label -> "Number:"
)
showUserView.scala.html /主视图的内容
@(user: Form[User])
@import helper._
@import helper.twitterBootstrap._
@main("Test") {
<H1>SHOW USER</H1>
@newUserView(user)
@documentView(user("user.document"))
}
在控制器中我正在构建表格:
Form<User> userForm = form("user", User.class);
这对我来说是一个很好的方法,我关心模型并与其他观点脱钩。