0

我正在为一个应用程序工作一个动态表单模块,其中有一个随机的问题列表作为答案提交。我遇到的问题是正在提交的 Answer[] 数组与视图中指定的顺序不同。(即视图中的 answer[0].value 作为 answer[3].value 进入控制器)。似乎不是将视图提交的数组视为真正的数组,而是将它们放入无序集,然后在到达控制器之前转换回数组。除了将数组视为无序集并且必须使用手动索引之外,还有什么方法可以解决这个问题。

我的控制器基本上是:

公共静态无效进程(Answer[] 答案){
   for(int i=0;i<answers.length;i++){
       如果(答案[i].question.required){
          Validation.required("answers["+i+"].value,answers[i].value);
       }
   }
   如果(验证。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
}

我建议您在视图上使用从零开始的索引数组,因为视图question_index上的变量以 value 开头1。如果您坚持不使用从零开始的索引数组,您的列表大小将增加 1 个元素。这是因为您从 index 开始1,而0第 -th 索引具有null价值。

为避免这种情况,您的视图应如下所示:

 #{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 回答