【问题标题】:Play(Scala) Framework 2.4.x - Form validations to validate equality of two fields in the same form at field-levelPlay(Scala) Framework 2.4.x - 表单验证以在字段级别验证同一表单中两个字段的相等性
【发布时间】:2015-12-08 18:11:27
【问题描述】:

我的应用程序使用 Play-2.4.2/Scala-2.11.6 我使用 PlayForms+HTML+Bootstrap 自定义 用户注册模块的视图。

表单验证是服务器端验证,我使用 ScalaCustomValidation 来执行此操作。 https://www.playframework.com/documentation/2.4.x/ScalaCustomValidations

以下是播放文档提供的 ScalaCustomValidation 示例。

val allNumbers = """\d*""".r
val allLetters = """[A-Za-z]*""".r

val passwordCheckConstraint: Constraint[String] = Constraint("constraints.passwordcheck")({
  plainText =>
    val errors = plainText match {
      case allNumbers() => Seq(ValidationError("Password is all numbers"))
      case allLetters() => Seq(ValidationError("Password is all letters"))
      case _ => Nil
    }
    if (errors.isEmpty) {
      Valid
    } else {
      Invalid(errors)
    }
}) 

现在可以在用户表单上调用此验证,如下所示

val userFormConstraintsAdHoc = Form(
  mapping(
    "username" -> nonEmptyText,
    "password" -> nonEmptyText(minLength = 12).verifying(passwordCheckConstraint),
   "confirmpassword" -> nonEmptyText(minLength = 12).verifying(passwordCheckConstraint)
  )(UserData.apply)(UserData.unapply) 
)

这可以正常工作并验证密码和确认密码字段的强度约束。 现在我需要定义一个约束来验证 password 和 confirmPassword 是否相等

有人可以帮助我编写这种特定类型的约束,它实际上读取相同表单的两个(或多个)字段的值并对这些字段的值执行一些验证

注意:我不想在案例类级别添加约束,我只想在字段级别添加它

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    我认为您需要来自多个字段的信息这一事实会阻止您使用字段级约束,因为它们应该是可组合的纯函数,无法访问外部状态。您可以使用 Forms.tuple 字段作为密码和确认并单独验证,但我不确定与表单级约束相比有什么优势:

    val userFormConstraintsAdHoc = Form(
      mapping(
        "username" -> nonEmptyText,
        "passwords" -> Forms.tuple(
          "password" -> nonEmptyText(minLength = 12),
          "confirm" -> nonEmptyText(minLength = 12)
        ).verifying("constraints.passwords.match", 
           passConfirm => passConfirm._1 == passConfirm._2)
      )(UserData.apply)(UserData.unapply) 
    )
    

    【讨论】:

    • 我同意,我认为涉及两个或多个字段的验证需要在单个字段验证部分之外完成。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2021-11-18
    • 2015-08-17
    • 2013-12-03
    相关资源
    最近更新 更多