0

想知道为什么在通过表单助手创建时,为表单创建的约束不直接包含在输入标签中?

说明(使用 Play 2.1):

模型:

public class Account {
    @MaxLength(5)
    private String id = "";

……

查看:@form(action = routes.Application.addAccount()) { @inputText(accountForm("id"), '_label -> "输入您的 id:")
}

在 html 中自动呈现为:

输入你的身份证:
最大长度:5

它不应该像这样呈现吗(实际上是约束表单文本字段):

输入你的身份证:
最大长度:5

我怎样才能获得在表单中自动包含这些约束的代码?只是我真的不认为在表单模型中定义一个 maxlength 并在视图中定义一个单独的 maxlength 是一个好主意。

谢谢

4

1 回答 1

1

如果我对您的理解正确,听起来您正在寻求实现以下功能之一:

  • 在提交表单之前突出显示过长的输入文本字段
  • 剪切输入字段中的文本,使其不会过长

Play 的 HTML 模板引擎本身并不提供这种客户端即时表单验证。这个功能需要通过 JavaScript 实现,而 JavaScript 的生成并不是 Play 真正关心的问题。

如果您想逐步增强表单并提供客户端验证,则必须自己编写 JavaScript。当然,您可以使用一些库来帮助您完成此任务。例如,如果你已经在使用 jQuery,你可以使用它的验证插件

正如您在问题中提到的那样,最好只在一个地方声明最大长度限制,而不是在客户端 JavaScript 代码和服务器端 Java 代码中重复。作为建议,您可以保留 Java 代码中声明的限制,但在控制器层中引入一个新操作,该操作返回包含此限制的 JSON 响应。然后可以在加载表单页面时通过 AJAX 调用此操作。


编辑

不知道该maxlength属性,谢谢Saad。如果您将最大长度限制作为模板的输入参数提供,则可以按如下方式填充input元素的属性:maxlength

@(accountForm: Form[Account], maxLength: Int)

...
  @form(action = routes.Application.addAccount()) { 
    ...
    @inputText(
      field = accountForm("id"), 
      args = '_label -> "Enter your id:", 'maxlength -> maxLength
    )
    ...
  }
...

可能有一种更优雅的方式可以传递maxLength给您的 HTML 模板(例如,使用 HTTP 上下文映射,或者将其作为Account表单对象上的公共字段)。上面的代码片段只是演示了如何在模板中访问输入文本字段后正确生成它。

于 2013-12-28T13:37:04.603 回答