2012-12-10 63 views
1

讓事情變得簡單,我有以下特性的模型調查:如何在MVC模型中爲下拉列表保留項目的集合?

class SurveyItem { 
    public string Question { get; set; } 
    public string SelectedAnswerCode { get; set; } 
    public List<Answer> Answers { get; set; } 
} 

這裏的答案是這樣的:

class Answer { 
    public int AnswerCode { get; set; } 
    public string AnswerText { get; set; } 
} 

答案被用來建立可能的答案的下拉列表框(一用戶選擇一個)

在我的視圖中,我使用IEnumerable模型 其中對於每個問題,我都有一個可供選擇的答案列表。

我預先填充這個集合並傳遞給我的視圖。當我點擊提交時,它會返回控制器進行驗證。如果模型無效,我將它傳遞給相同的視圖,以便用戶像往常一樣修復他的答案。

問題 - 用於下拉列表的答案集在我提交時不會保留在模型中。我使用HiddenFor,EditorFor和DropDownListFor作爲單值屬性,但是,如何在模型中保留一組可能的答案?

P.S>

感謝。

P.S.我使用單行代碼@ Html.DropDownListFor呈現下拉在我EditorTemplate:

@Html.DropDownListFor(model => model.SelectedAnswerCode, 
new SelectList(Model.Answers, "AnswerCode", "AnswerText", 0)) 

回答

0

你需要添加virtual的答案聲明。

class SurveyItem { 
    public string Question { get; set; } 
    public string SelectedAnswerCode { get; set; } 
    public virtual List<Answer> Answers { get; set; } 
} 
+0

對不起,沒有幫助。不知道這可能會有幫助。 – monstro

+0

http://stackoverflow.com/questions/13749631/collection-nested-within-model-is-not-bound-by-mvc-3-always-null/13749809#13749809 –

+0

您可能需要添加一個外鍵。在兩個類中都像QuestionId一樣。然後,EF應該查找與您正在迭代的任何問題相同的QuestionId的所有答案。 –

0

這似乎這樣的伎倆:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

基本上在你看來做這樣的事情:

@for(int i = 0; i < Model.Answers.Count; i++) 
      { 
       @Html.Hidden(string.Format("Answers[{0}].AnswerCode", i), Model.Answers[i].AnswerCode) 
       @Html.Hidden(string.Format("Answers[{0}].AnswerText", i), Model.Answers[i].AnswerText) 

       @Html.RadioButton("SelectedAnswerCode", Model.Answers[i].AnswerCode) 
       @Model.Answers[i].AnswerText 
      } 

編輯:

或者,您也可以創建自己的HtmlHelper擴展。例如:

public static class CustomHtmlHelperExtensions 
    { 
     public static MvcHtmlString HiddenForSurveyAnswers(this HtmlHelper htmlHelper, IEnumerable<Models.Answer> answers) 
     { 
      var html = new StringBuilder(); 

      int index = 0; 
      foreach (var answer in answers) 
      { 
       html.AppendLine(htmlHelper.Hidden(string.Format("Answers[{0}].AnswerCode", index), answer.AnswerCode).ToString()); 
       html.AppendLine(htmlHelper.Hidden(string.Format("Answers[{0}].AnswerText", index), answer.AnswerText).ToString()); 
       index++; 
      } 

      return MvcHtmlString.Create(html.ToString()); 
     } 
    } 

然後添加一個@using YourMvcApplicationNamespace到視圖的頂部,然後使用擴展名,如:

@Html.HiddenForSurveyAnswers(Model.Answers) 
+0

謝謝,但我使用單行代碼@ Html.DropDownListFor在我的編輯器模板中顯示下拉列表。請參閱> P.S. – monstro

+0

@Sigourney_Weaver看到我的編輯上面創建自己的HtmlHelper擴展輸出額外的隱藏字段 –

0

在MVC中,你可以寫一個編輯模板保存Model.Answers爲以及:)

保存視圖命名爲\Views\Shared\EditorTemplatesAnswer.chtml

添加以下代碼:

@model Answer   
@Html.HiddenFor(item => item.AnswerCode) 
@Html.HiddenFor(item => item.AnswerText) 

然後在你原來的觀點,將其添加:

@Html.EditorFor(model => model.Answers) 
@Html.DropDownListFor(model => model.SelectedAnswerCode, new SelectList(Model.Answers, "AnswerCode", "AnswerText", 0)) 

通過這種方式,你不必擔心寫foreach陳述或者擔心自己的IDS。 希望它有幫助。

相關問題