【问题标题】:Only bind part of the Form mappings from request仅从请求中绑定部分表单映射
【发布时间】:2013-08-15 15:17:46
【问题描述】:

我正在使用 Play 2.1.2,并且我有一个具有以下映射的表单:

Form(
    mapping(
      "id" -> ignored(NotAssigned: Pk[Long]),
      "name" -> nonEmptyText,
      "stock" -> number(min = 0),
      "initialAmount" -> number(min = 0),
      "distUnitId" -> longNumber,
      "categoryId" -> longNumber
    )
    (BarItem.apply)
    (BarItem.unapply)
)

在视图中,我想使用表单助手来编辑部分值。特别是,“initialAmount”值只能设置一次 - 在创建项目时 - 并且不允许在编辑时更改。所以我只是不想在表单中显示它并在表单提交后“保留”它以前的值。

目前编辑视图中有趣的部分如下所示:

 @form(routes.Application.update(id), 'class -> "form-inline") {

        <fieldset>

            @inputText(barItemEditForm("name"), '_label -> "Produktbezeichnung")
            @inputText(barItemEditForm("stock"), '_label -> "Lagermenge")
            @select(
                barItemEditForm("distUnitId"),
                distUnits,
                '_label -> "Einheit"
            )

         @select(
                barItemEditForm("categoryId"),
                categories,
                '_label -> "Kategorie"

            )

导航到编辑视图时,我使用 Form 类的 fill() 方法填充表单:

 BarItem.findById(id).map {
      item =>
        Ok(html.edit(id, barItemEditForm.fill(item), DistUnit.selectOptions, Category.selectOptions))
 }.getOrElse(NotFound)

在处理表单提交的操作中,我从请求中绑定表单,如下所示:

...
implicit request =>
      barItemEditForm.bindFromRequest.fold(
        formWithErrors => BadRequest(html.edit(id, formWithErrors, DistUnit.selectOptions, Category.selectOptions)),
        item => {
          ...updateStuff...
        }
      )
...

所以现在的问题是,由于我在视图中没有“initialAmount”的输入字段,所以在从请求绑定时出现错误,说它没有价值。

是否有可能只应用请求中的部分值并在之前对 fill() 的调用中保留这个值?

或者任何人都可以提出处理这种“部分编辑”的正确方法吗?

我真的很期待任何建议!

【问题讨论】:

    标签: scala playframework playframework-2.1


    【解决方案1】:

    由于您想保留该值,这可能意味着在您重新呈现表单时隐藏输入。如果先前的值来自其他地方,例如数据库,您可以为该字段定义另一个带有ignored 映射的表单。

    【讨论】:

    • 我暂时使用了隐藏输入法,虽然我认为它不是很优雅。 ignore() 映射实际上不起作用,因为我必须提供不适用于我的案例类 (BarItem) 的自定义 apply() 和 unapply() 函数。所以要么必须为没有“initialValue”的 BarItem 创建一个新的案例类,要么我必须将值保存在一个简单的元组中。在这两种情况下,我都必须在更新方法中再次从数据库中获取当前值,并将它们与表单中的新值合并。还是我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2014-01-25
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多