【问题标题】:How to display ad hoc constraints form validation messages?如何显示临时约束表单验证消息?
【发布时间】:2012-07-08 06:16:13
【问题描述】:

ScalaForms

在链接here 的示例中,有这个关于表单验证的示例:

// You can also define ad-hoc constraints on the fields:
val loginForm = Form(
  tuple(
    "email" -> nonEmptyText,
    "password" -> text
  ) verifying("Invalid user name or password", fields => fields match { 
      case (e, p) => User.authenticate(e,p).isDefined 
  })
)

由于绑定错误,一些约束会显示在我的表单中。 (就像nonEmptyText,它在字段后面有一个额外的行,说明This field is required。见:

loginForm.bindFromRequest.fold(
  formWithErrors => // binding failure, you retrieve the form containing errors,
  value => // binding success, you get the actual value 
)

如果我对formWithErrors 执行.toString,我会得到nonEmptyText 约束:

Form(ObjectMapping2(<function2>,<function1>,(Email adress,FieldMapping(,List(Constraint(Some(constraint.required),WrappedArray())))),(Password,FieldMapping(,List(Constraint(Some(constraint.required),WrappedArray())))),,List(Constraint(None,List()))),Map(Password -> test, Email adress -> ),List(FormError(Email adress,error.required,WrappedArray())),None)

后半部分是FormError 列表:List(FormError(Email adress,error.required,WrappedArray())),None) 这是一个案例类:case class FormError (key: String, message: String, args: Seq[Any]),其中key 定义为:The error key (should be associated with a field using the same key).

FieldConstructor 将其选中并使“电子邮件地址”输入框变为红色并添加错误消息(“此字段为必填项”)。

显示临时约束?

所以当表单字段都填满时,检查用户名和密码:

verifying("Invalid user name or password", fields => fields match { 
      case (e, p) => User.authenticate(e,p).isDefined 
  })

但我不知道如何向用户显示“无效的用户名或密码”。 formWithErrorsFormError 列表中的.toString 是:

List(FormError(,Invalid user name or password,WrappedArray())),None)

Key 部分为空。

问题

如何显示临时错误?

我什至尝试过:

BadRequest( views.html.test( formWithErrors ) ).flashing( "error" -> "Invalid user name or password." ) },

但由于某种原因,它也不能通过 Flash 工作 :(。这个 @flash.get("error").getOrElse("no 'error'") 每次都给我“没有错误”。

【问题讨论】:

  • 你有没有想过如何让密钥出现在错误中?我有同样的问题。

标签: scala playframework-2.0


【解决方案1】:

实际上,一个表单可以附加errors,因此当来自请求的绑定验证约束失败时,会根据给定的表单创建一个新表单,但用errors填充。

此类错误列表由 FormError 组成,它引用表单字段并覆盖 toString 以显示其嵌入消息。

这样,如果您希望一次显示所有消息,您可以简单地 formWithErrors.errors.mkString("&lt;br&gt;") 例如(在您的模板中或闪烁它)。

有很多方法,这里描述了一些常见的方法http://www.playframework.org/documentation/2.0.2/ScalaFormHelpers。您也可以定义自己的字段构造函数。

总而言之,我的建议是您应该使用助手 amap(例如 @inputTextco),因为它们已经包含显示助手、提示和 错误 的逻辑strong> 可用时。

编辑

我错过了有关 flash 问题的提示...您可能忘记将 (implicit flash: Flash) 添加到您的模板参数列表中。 (不要忘记在您的操作定义中将请求标记为隐式)

【讨论】:

  • 您好,感谢您的回复。虽然它不是我想找的东西。原因如下:我正在使用 FormHelpers,甚至添加了我自己的引导程序(但禁用它来测试它)。临时错误不在 1 个字段上,而是在一个组合上。 (因此助手没有显示错误。)我的模板中的“@formWithErrors.errors.toString”提示很有帮助。正如我确实看到那里的错误。 (尽管它是多个错误的列表。)我认为关键在于“关键”是空的。我将使用您的“.errors”和一些逻辑来过滤掉“一般”错误消息。知道为什么我的@flash 没有收到吗?
  • 无页码。您还可以做些什么来过滤掉与 formWithErrors.errors.filter(_.key == "") 一样的空键相关的所有错误消息。它为您提供了一系列表单错误(应该是单例)。这将是顶层的错误。
  • 感谢您的回复!过滤嘴很好,我会用它。编辑(用于闪光灯):我确实添加了。否则闪存可以正常工作,因为这样的行(到同一页面)向我显示了闪存消息:Redirect( routes.UserManagement.login ).withNewSession.flashing("success" -&gt; "You are now logged out." ) views.html.test( formWithErrors ) 并且上面引用的工作线使用反向路由。这可能是它不拿起闪光灯的原因吗?
  • 嗯应该也可以这样工作...也许您可以尝试使用其他键而不是错误...虽然很奇怪但仍然如此。
猜你喜欢
  • 2020-09-23
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2019-01-30
相关资源
最近更新 更多