0

フォーム ヘルパーを介して作成されたときに、フォーム用に作成された制約が入力タグに直接含まれていないのはなぜでしょうか?

説明 (Play 2.1 を使用):

モデル:

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

... ... ...

view: @form(action = routes.Application.addAccount()) { @inputText(accountForm("id"), '_label -> "ID を入力してください:")
}

次のように html で自動的にレンダリングされます。

ID を入力してください:
最大長: 5

このようにレンダリングしないでください (実際にはフォームのテキスト フィールドを制限します):

ID を入力してください:
最大長: 5

このような制約をフォームに自動的に含めるコードを取得するにはどうすればよいですか? フォーム モデルで maxlength を定義し、ビューで別の maxlength を定義するのは良い考えだとは思いません。

ありがとう

4

1 に答える 1

1

私の理解が正しければ、次の機能のいずれかを実装しようとしているように思えます。

  • フォーム送信前に長すぎる入力テキスト フィールドを強調表示する
  • 入力フィールド内のテキストが長すぎないようにクリッピングする

Play の HTML テンプレート エンジンは、この種のクライアント側のインスタント フォーム検証をネイティブには提供していません。この機能は JavaScript を介して実装する必要があり、JavaScript の生成は Play にとって実際には問題ではありません。

フォームを段階的に強化し、クライアント側の検証を提供する場合は、JavaScript を自分で作成する必要があります。もちろん、このタスクを支援するために使用できるライブラリがあります。たとえば、すでに jQuery を使用している場合は、その検証プラグインを使用できます。

質問で述べたように、クライアント側の JavaScript コードとサーバー側の Java コードで重複するのではなく、最大長の制限を 1 か所だけで宣言する方がよいでしょう。提案として、制限を Java コードで宣言したままにし、この制限を含む JSON 応答を返す新しいアクションをコントローラー層に導入することができます。このアクションは、フォーム ページをロードするときに AJAX 経由で呼び出すことができます。


編集

属性について知りませんでした。Saadmaxlengthに感謝します。テンプレートへの入力パラメーターとして最大長制限をフィードする場合、次のように要素の属性を設定できます。inputmaxlength

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

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

HTML テンプレートに渡すより洗練された方法があるかもしれません(たとえば、HTTP コンテキスト マップを使用するか、フォーム オブジェクトmaxLengthのパブリック フィールドとして使用します)。Account上記のコード スニペットは、テンプレートでアクセスできるようになったら、入力テキスト フィールドを正しく生成する方法を示しています。

于 2013-12-28T13:37:04.603 に答える