2013-05-06 50 views
0

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

我控制器基本上是:

 
public static void process(Answer[] answers){ 
    for(int i=0;i<answers.length;i++){ 
     if(answers[i].question.required){ 
      Validation.required("answers["+i+"].value,answers[i].value); 
     } 
    } 
    if(Validation.hasErrors()){ 
    //render the template 
    }else{ 
     //save 
    } 
} 

在我的模板

 
    #{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/> 
    #{/list} 
+0

如果你使用'名单'来代替'回答[]数组'? – 2013-05-06 23:45:42

回答

1

!注:我使用播放框架1.2.5

您应该使用用于控制器方法信号的List<Answer> TURE而不是Answer[]

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

我建议你使用你的观点基于零的索引阵列,因为在视图question_index变量开始与价值1。如果你坚持不使用零基索引数组,你的列表大小将增加1个元素。这是因为您从索引1开始,并且0第 - 个索引具有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} 
+0

列表修复了排序问题。 (也感谢绿色人士也指出了这一点) – 2013-05-09 18:33:22