使用自定义验证处理可选字段的表单映射

时间:2014-06-02 21:43:54

标签: scala playframework

我的表单如下:

case class RegistrationForm(department: Option[String], name: String, email: String, employeeId: Option[Int])

现在我需要做的是,如果用户输入department输入,那么employeeId应为None。如果他们将department留空,则employeeId将成为必填字段。

我的映射目前是这个,但它没有处理这个逻辑:

val registrationForm = Form(
  mapping(
    "department" -> optional(String)
    "name" -> nonEmptyText,
    "email" -> nonEmptyText,
    "employeeId" -> optional(number)
  )(RegistrationForm.apply)(RegistrationForm.unapply)
)

另外,在我的表单中,如何创建隐藏的输入字段并将其绑定到我的表单属性,因为有时我的网址会像:

/users/register?employeeId=293838

所以我想创建:

<input type="hidden" name="employeeId" value="???" />

所以这个employeeId隐藏的输入应该绑定到表单。

1 个答案:

答案 0 :(得分:2)

您可以使用verifying在表单字段之后构建约束它们都已成功绑定到案例类。

val registrationForm = Form(
    mapping(
        "department" -> optional(String)
        "name" -> nonEmptyText,
        "email" -> nonEmptyText,
        "employeeId" -> optional(number)
     )(RegistrationForm.apply)(RegistrationForm.unapply)
    .verifying("Some error message..", reg => 
        (reg.department.isEmpty || reg.employeeId.isEmpty) && (reg.department.nonEmpty || reg.employeeId.nonEmpty)
    )
)

verifying的第一个参数是在约束被破坏时使用的错误消息,第二个参数是您绑定到的返回Boolean的案例类的函数。如果函数返回false,则Form将包含全局错误。我不是100%肯定这是你在我的例子中的逻辑,因为你的措辞有点奇怪(听起来你正在描述异或)。如果需要,您还可以将多个verifying操作链接在一起。

我不确定你对隐藏字段的问题是什么。 html表单中的隐藏字段将与其他所有内容一起发送到服务器,并像任何其他字段一样绑定。