2013-05-06 25 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