試圖爲客戶端創建問卷頁面。這是一個相當大的問題列表,所以我將它分成了幾個小節和小節,以方便用戶導航。問題似乎是,爲了構建頁面,我遍歷了部分/子部分/問題,而不是答案。答案存儲在字典中,關鍵字是關聯問題的ID號。MVC ViewModel包含字段,用於向控制器返回空的字段
視圖模型傳遞給視圖是UserQuestionnaireViewModel
,QuestionnaireViewModel
具有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 = ""
});
}}}}}}
的Section
和SubSection
類包含一個名稱字符串,以及任何的列表來根據他們(SubSection
和Question
分別)。 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和字典的一般問題,或者僅僅是沒有綁定字典。數據庫中的任何答案都能正確顯示,它只是無法將頁面內容返回給控制器,從而阻止我向前移動。
如何使用Html.Hidden(「Answers [」+ question.ID +「] .XXXX'?從隱藏元素的名稱中刪除'Model.' – Ricky
@Ricky同樣的結果 – TJennings
與主題無關,但如果你使用的是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