2

我正在使用 PlayFramwork 和 Java 的 Web 应用程序中工作。我正在尝试在主视图中实现一个简单的表单,但在这个视图中我添加了不同的模板。将参数传递给视图时遇到了一些问题。错误是:

类型不匹配; 找到:play.data.Form.Field 需要: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]?

4

2 回答 2

1

我将表单参数更改为 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);

这对我来说是一个好方法,我关心模型并与其他视图脱钩。

于 2014-06-10T15:20:10.570 回答
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>标签 - 只是字段 - 您需要在适当的地方添加

于 2012-10-26T09:45:59.973 回答