2015-12-08 60 views
2

試圖爲客戶端創建問卷頁面。這是一個相當大的問題列表,所以我將它分成了幾個小節和小節,以方便用戶導航。問題似乎是,爲了構建頁面,我遍歷了部分/子部分/問題,而不是答案。答案存儲在字典中,關鍵字是關聯問題的ID號。MVC ViewModel包含字段,用於向控制器返回空的字段

視圖模型傳遞給視圖是UserQuestionnaireViewModelQuestionnaireViewModel具有Sections,其每一個具有SubSections列表,其中的每一個具有Questions列表的列表。 Answers詞典獲取所有Answers鏈接到相關用戶,由他們鏈接到的Question索引。缺少答案在這裏填充,視圖如果缺失就會中斷。

型號

public class UserQuestionnaireViewModel { 
    ClientPortalDbContext db = new ClientPortalDbContext(); 

    public QuestionnaireViewModel Questionnaire { get; set; } 
    public Dictionary<Int32, QuestionnaireAnswer> Answers { get; set; } 

    public UserQuestionnaireViewModel() { } 
    public UserQuestionnaireViewModel(Int32 userID) { 
     Questionnaire = new QuestionnaireViewModel(); 
     Answers = new Dictionary<Int32, QuestionnaireAnswer>(); 

     List<QuestionnaireAnswer> answerList = db.QuestionnaireAnswers.Where(a => a.UserID == userID).ToList(); 
     foreach (QuestionnaireAnswer answer in answerList) { 
      Answers.Add(answer.QuestionID, answer); 
     } 
     foreach (QuestionnaireViewModel_Section section in Questionnaire.Sections) { 
      foreach (QuestionnaireViewModel_SubSection subsection in section.SubSections) { 
       foreach (QuestionnaireQuestion question in subsection.Questions) { 
        if (!Answers.ContainsKey(question.ID)) { 
         Answers.Add(question.ID, new QuestionnaireAnswer() { 
          QuestionID = question.ID, 
          UserID = userID, 
          AnswerBool = false, 
          AnswerText = "" 
         }); 
}}}}}} 

SectionSubSection類包含一個名稱字符串,以及任何的列表來根據他們(SubSectionQuestion分別)。 Question有一個id int,問題文本的字符串,以及顯示哪些字段的布爾值。

查看

<div class="content-wrapper"> 
    <% using (Html.BeginForm("Save", "Questionnaire", new { input = Model.Answers })) { %> 
    <%: Html.AntiForgeryToken()%> 
    <%: Html.ValidationSummary(true)%> 
    <fieldset> 
     <ul class="questionnaire-tabs"> 
      <% Int32 tabIndex = 0; %> 
      <% foreach (clientportal.Models.QuestionnaireViewModel_Section section in Model.Questionnaire.Sections) { %> 
      <% tabIndex++; %> 
      <li id="<%: "tab-button-" + tabIndex.ToString()%>" data-tab="<%: "tab-" + tabIndex.ToString()%>"> 
       <%: section.Name%> 
      </li> 
      <% } %> 
     </ul> 
     <div class="clear"></div> 
     <% tabIndex = 0; %> 
     <% foreach (clientportal.Models.QuestionnaireViewModel_Section section in Model.Questionnaire.Sections) { %> 
     <% tabIndex++; %> 
     <div class="questionnaire-tab-content" id="<%: "tab-" + tabIndex.ToString()%>"> 
      <p><%: section.Heading%></p> 
      <% foreach (clientportal.Models.QuestionnaireViewModel_SubSection subsection in section.SubSections) { %> 
      <h4><%: subsection.Name%></h4> 
      <p><%: subsection.Heading%></p> 
      <div> 
       <table class="questionnaire-table"> 
        <% foreach (clientportal.Models.QuestionnaireQuestion question in subsection.Questions) { %> 
        <% clientportal.Models.QuestionnaireAnswer answer = Model.Answers[question.ID]; %> 
        <% if (question.Enabled) { %> 
        <tr> 
         <td class="label-col"> 
          <%: Html.Label(question.Text) %> 
          <%: Html.Hidden("Model.Answers.Index", question.ID) %> 
          <%: Html.Hidden("Model.Answers[" + question.ID + "].ID", answer.ID) %> 
          <%: Html.Hidden("Model.Answers[" + question.ID + "].QuestionID", answer.QuestionID) %> 
          <%: Html.Hidden("Model.Answers[" + question.ID + "].UserID", answer.UserID) %> 
         </td> 
         <td class="bool-col"> 
          <% if (question.ShowCheckBox) { %> 
          <%: Html.CheckBox("Model.Answers[" + question.ID + "].AnswerBool", answer.AnswerBool) %> 
          <% } else { %> 
          <%: Html.Hidden("Model.Answers[" + question.ID + "].AnswerBool", answer.AnswerBool) %> 
          <% } %> 
         </td> 
         <td class="text-col"> 
          <% if (question.ShowTextBox) { %> 
          <%: Html.TextBox("Model.Answers[" + question.ID + "].AnswerText", answer.AnswerText) %> 
          <% } else { %> 
          <%: Html.Hidden("Model.Answers[" + question.ID + "].AnswerText", answer.AnswerText) %> 
          <% } %> 
         </td> 
        </tr> 
        <% } %> 
        <% } %> 
       </table> 
      </div> 
      <% } %> 
     </div> 
     <% } %> 
    </fieldset> 
    <h4>Please ensure you have checked all sections of the Questionnaire before saving.</h4> 
    <input type="submit" value="Save Answers" /> 
    <% } %> 
</div> 

在提交表單,它通過在控制器罰款(該控制器需要一個Dictionary<Int32, QuestionnaireAnswer>這個動作),除了通過有0行發送的模式和失敗ModelState.IsValid

環顧SO給了我一個想法,即這是MVC和字典的一般問題,或者僅僅是沒有綁定字典。數據庫中的任何答案都能正確顯示,它只是無法將頁面內容返回給控制器,從而阻止我向前移動。

+0

如何使用Html.Hidden(「Answers [」+ question.ID +「] .XXXX'?從隱藏元素的名稱中刪除'Model.' – Ricky

+0

@Ricky同樣的結果 – TJennings

+0

與主題無關,但如果你使用的是MVC,我建議你使用[Razor Engine](https://www.asp.net/web-pages/overview/getting-started/introducing-razor-syntax-c)而不是[ASPX View引擎](http://www.webdevelopmenthelp.net/2014/10/aspx-view-engine-vs-razor-view-engine.html),它更好 – Catalin

回答

0

請勿使用foreach循環。使用for循環。 還有一件事情總是使用Html.HiddenFor(model.xxxx)以及其他控件。

如果使用for循環連同HiddenFor這將自動爲控制

如果有可能從MVC模式那麼最好分離出的數據庫操作創建合適的名稱。