Scala Play 表单日期验证

Scala Play form date validation

我正在使用 Scala Play 2。5.x 并且我正在尝试进行一些日期验证。用户可以使用此表单搜索项目,以及日期范围选项:fromDatetoDate

val searchForm = Form(
mapping(
  "itemID" -> nonEmptyText,
  "fromDate" ->  optional(date),
  "toDate" -> optional(date),
  "type" -> optional(text),
  "itemClass" -> optional(text),
  "status" -> optional(text),
  "component" -> nonEmptyText
)(SearchModel.apply)(SearchModel.unapply) verifying("To Date must be greater than From Date", f => f.toDate > f.fromDate))

Play 已经涵盖了格式验证,但问题是 toDate 需要大于 fromDate,如果输入其中一个日期,另一个也必须被输入。

如何在表单中实现这些条件?我是否应该在 viewcontrollercase class 等其他地方进行此验证?

您可以使用 .verifying

在表单上添加验证
    val searchForm = Form(
    mapping(
   "itemID" -> nonEmptyText,
   "fromDate" ->  optional(date).verifying("Invalid Date", date => true /* any condition or a function which checks the date condition*/),
   "toDate" -> optional(date),
   "type" -> optional(text),
   "itemClass" -> optional(text),
   "status" -> optional(text),
   "component" -> nonEmptyText
   )(SearchModel.apply)(SearchModel.unapply)

供参考:- https://www.playframework.com/documentation/2.5.x/ScalaForms#Defining-ad-hoc-constraints

我希望这就是你所要求的。

为了实现您的验证需求,您可以将其保留在您的表单定义中并添加另一个 verifying:

val searchForm = Form(
mapping(
  "itemID" -> nonEmptyText,
  "fromDate" ->  optional(date),
  "toDate" -> optional(date),
  "type" -> optional(text),
  "itemClass" -> optional(text),
  "status" -> optional(text),
  "component" -> nonEmptyText
)(SearchModel.apply)(SearchModel.unapply)
  verifying("You must provide zero or both dates", f => f.toDate.isEmpty && f.fromDate.isEmpty || f.toDate.isDefined && f.fromDate.isDefined)
  verifying("To Date must be greater than From Date", f => if (f.toDate.isDefined && f.fromDate.isDefined) f.toDate.get > f.fromDate.get else true)
)