0

回答として送信される質問のランダムなリストがあるアプリケーションの動的フォーム モジュールを使用しています。私が抱えている問題は、送信されている Answer[] 配列がビューで指定された順序と同じでないことです。(つまり、ビューの answer[0].value は answer[3].value としてコントローラに入ります)。ビューによって送信された配列を真の配列として扱う代わりに、それらは順序付けられていないセットになり、コントローラーに到達する前に配列に変換されているようです。配列を順序付けられていないセットとして扱い、手動インデックスを使用する以外に、これを回避する方法はありますか。

私のコントローラーは基本的に次のとおりです。

public static void process(Answer[] 回答){
   for(int i=0;i<answers.length;i++){
       if(answers[i].question.required){
          Validation.required("answers["+i+"].value,answers[i].value);
       }
   }
   if(検証.hasErrors()){
     // テンプレートをレンダリングする
   }そうしないと{
      //保存
   }
}

私のテンプレートでは

   #{list items:questionSet.questions, as:"question"}
      ...
      <div class="#{if play.data.validation.Validation.hasError("anwsers["+question_index+'].value)}error#{/if}">
      <input name="answers[${question_index}].question.id" value="${question.id}"/>
      <input name="answers[${question_index}].value" value="${answers[question_index].value}/>
      <div/>
   #{/リスト}
4

1 に答える 1

1

注: Play!Framework 1.2.5を使用しています

List<Answer>次の代わりに、コントローラーメソッドの署名に使用する必要がありますAnswer[]

public static void process(List<Answer> answers) {
    ... // your logic
}

ビューの変数は value で始まるため、ビューでzero-based-indexing-arrayを使用することをお勧めします。zero-based-indexing-arrayを使用しないと主張する場合、リストのサイズは 1 要素分大きくなります。これは、 index から開始し、- 番目のインデックスに値があるためです。question_index110null

それを避けるには、ビューを次のようにする必要があります。

 #{list items:questionSet.questions, as:"question"}
 <div class="...">
    <input name="answers[${question_index-1}].id" value="${...}"/>
    <input name="answers[${question_index-1}].value" value="${...}"/>
 </div>
 #{/list}
于 2013-05-08T14:08:35.990 に答える