DropDownListFor显示List <list <string>&gt; </list <string>的所有元素

时间:2014-09-17 15:42:57

标签: c# asp.net-mvc razor

我正在尝试使用@Html.DropDownListFor将选择添加到多个下拉列表中。

查看

  for (int i = 0; i < Model.questions.Count(); i++)
{
        <fieldset>
            <legend>Questions</legend>

            <div class="editor-label">
                @Html.DisplayFor(model=>model.questions[i].Question)

            </div>
            <div class="editor-field">    
               @Html.DropDownListFor(model => model.answers[i].Answers, new SelectList(Model.hold[i]))
            </div>  
            <hr />
        </fieldset>
}

这会遍历我的模型中的所有问题并显示问题。下拉框用于用户选择该问题的答案。由于管理员用户动态创建问题和答案的数量,我不能简单地制作静态列表并将其插入下拉列表。

控制器

  public ActionResult Index()
    {
        //get the list of questions from db
        var q = (from questions in db.questions select questions).ToList();
        var answersList = (from answer in db.answers select answer).ToList();
        List<List<string>> aList = SplitAnswers();

        QAViewModel qa = new QAViewModel{questions = q, hold = aList, questionAnswers = answersList};

        return View(qa);
    }

   public List<List<string>> SplitAnswers()
   {
       List<List<string>> aList = new List<List<string>>();
       List<string> populate = new List<string>();
       var answersList = (from answer in db.answers select answer).ToList();
       var q = (from questions in db.questions select questions).ToList();

       //Group answers by questionId to use in the view
       for (int i = 0; i < q.Count(); i++)
       {
           for (int x = 0; x < answersList.Count(); x++)
           {
               if (answersList[x].QuestionsId == q[i].Qid)
               {
                   populate.Add(answersList[x].answer);
               }
           }
           aList.Insert(i, populate);
       }

       System.Diagnostics.Debug.WriteLine("test" + aList[1]);
       return aList;
   }

我正在使用aList(类型为List<List<string>>),以便我可以在populate的每个元素中存储List<string>(类型为aList) 。但是,每个下拉列表最终都会显示aList的所有元素。

我不确定我是否误用了List<List<string>>,或者我是否以某种方式在populate的每个元素中添加了aList的所有元素。

更新

通过更改Model.hold@Html.DropDownListFor(model => model.answers[i].Answers, new SelectList(Model.hold[1]))的索引,我可以看到此列表中的每个元素都包含所有答案。

1 个答案:

答案 0 :(得分:0)

经过多次试验和错误,我已经找到了解决此问题的方法。我最终使用了List数组。

...

    List<string>[] populate = new List<string>[30];

...

   for (int i = 0; i < q.Count(); i++)
       {
           populate[i] = new List<string>();
           for (int x = 0; x < answersList.Count(); x++)
           {

               if (answersList[x].QuestionsId == q[i].Qid)
               {

                   populate[i].Add(answersList[x].answer);
                   System.Diagnostics.Debug.WriteLine("answers " + i + " " + answersList[x].answer);
               }
           }
           aList.Add(i, populate[i]);
       }

每次需要存储新问题答案时,都可以创建new List<string>。然后,这些答案字符串可以存储在数组的该元素中。每次将问题答案添加到数组中时,我都会将该元素添加到我的List<List<string>>

然后在视图中不需要更改这行代码。

@Html.DropDownListFor(model => model.answers[i].Answers, new SelectList(Model.hold[i]))