【问题标题】:How do you create a Playframework 2.0 Form with a field that is conditionally required?如何创建一个带有条件必填字段的 Playframework 2.0 表单?
【发布时间】:2012-09-12 08:46:27
【问题描述】:

假设我想要一个带有字段的表单,电子邮件,只有当他们没有输入他们的电话号码时才需要这个字段。此外,只有当他们没有输入他们的电子邮件时才需要电话号码,我该怎么做?

如果 requiredNoValid 存在,我想做这样的事情。

import play.api.data._
import play.api.data.Forms._
import play.api.data.validation.Constraints._

case class User(email: Option[String] = None, age: Option[Int])

val userForm = Form(
  mapping(
    "email" -> email.verifying(requiredNoValid(phoneNumber)),
    "phoneNumber" -> number.verifying(requiredNoValid(email))
  )(User.apply)(User.unapply)
)

我已经在 Play 1.X 中为此构建了自己的解决方案,但我想放弃其中的大部分并使用 Play 2 表单来为我执行此操作(如果功能存在或有办法的话)通过实现验证器或约束来实现。

【问题讨论】:

    标签: scala validation playframework playframework-2.0


    【解决方案1】:

    您还可以在多个字段中添加verifying。举个简单的例子:

    val userForm = Form(
      mapping(
        "email" -> optional(email),
        "phoneNumber" -> optional(number)
      ) verifying("You must provide your email or phone number.", { 
          case (e, p) => 
            isValidEmail(e) || isValidPhoneNumber(p)
      })(User.apply)(User.unapply)
    )
    

    现在在外部验证中,您可以访问电子邮件和电话号码,并且可以进行交叉验证。

    【讨论】:

    • 哦,太好了,与我的 Play 1 代码相比,它仍然相对简单。谢谢!
    【解决方案2】:

    此解决方案适用于 Java,但如果您使用 scala,我相信您可以使用类似的方法 提交并验证后,您可以获得绑定的表单数据。如果它无效,您可以拒绝带有一些错误消息的表单。例如:

    //Get filled form
    Form<User> filledForm = userForm.bindFromRequest();
    //Get the user object
    User u = filledForm.get();
    
    //If both are not empty
    if(u.phoneNumber.isEmpty() && u.email.isEmpty()){
        filledForm.reject("email", "You must provide a valid email or phone number");
    } 
    

    【讨论】:

      猜你喜欢
      • 2013-02-21
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2016-05-22
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多