考虑一个动态调查表,其中包含 n个问题,对于每个问题,可以有 n个答案
<form>
<!-- Question block -->
<input id="QuestionText" name="QuestionText" placeholder="Text otázky" value="" type="text">
<table>
<!-- Answer block -->
<tr><td><input name="AnswerIsCorrect" type="checkbox"></td>
<td><input name="AnswerText" type="text"></td>
</tr>
<!-- Answer block END -->
<tr><td><input name="AnswerIsCorrect" type="checkbox"></td>
<td><input name="AnswerText" type="text"></td>
</tr>
<!-- More answers -->
</table>
<input id="QuestionComment" type="text">
<!-- Question block END -->
<!-- More questions -->
</form>
是否有可能让MVC将提交解析为类似的结构:
public class CreateSurveyModel
{
public List<QuestionModel> Questions { get; set; }
}
public class QuestionModel
{
public string QuestionText { get; set; }
public string QuestionComment { get; set; }
public List<AnswerModel> Answers { get; set; }
}
public class AnswerModel
{
public string AnswerText { get; set; }
public bool IsCorrect { get; set; }
}
如果是这样的话?
编辑(如答案中所示):
@using(Html.BeginForm("Send", "Try", FormMethod.Post/*or FormMethod.Get*/))
{
foreach(var question in Model.Questions)
{
<!-- Question block -->
@Html.TextBox("QuestionText", question.QuestionText)
<table>
@foreach(var answer in question.Answers)
{
<!-- Answer block -->
<tr>
<td>@Html.CheckBox("AnswerIsCorrect", answer.IsCorrect)</td>
<td>@Html.TextBox("AnswerText", answer.AnswerText )</td>
</tr>
<!-- Answer block END -->
}
</table>
@Html.TextBox("QuestionComment", question.QuestionComment)
<!-- Question block END -->
}
<input type="submit"/>
}
行动:
[HttpPost]
public ActionResult Send(CreateSurveyModel model)
{
return Index();
}
但是model.Questions为null
答案 0 :(得分:1)
在视图中使用以下结构:
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Questions.Count(); i++)
{
@Html.TextBoxFor(model => model.Questions[i].QuestionText, new { placeholder = "Text otázky" })
<table>
@for (int j = 0; j < Model.Questions[i].Answers.Count(); j++)
{
<!-- Answer block -->
<tr>
<td>@Html.CheckBoxFor(model => model.Questions[i].Answers[j].IsCorrect)</td>
<td>@Html.TextBoxFor(model => model.Questions[i].Answers[j].AnswerText)</td>
</tr>
}
</table>
@Html.TextBoxFor(model => model.Questions[i].QuestionComment)
<!-- Question block END -->
}
<input type="submit"/>
}
此代码可帮助您正确填充视图,并将模型正确传递给视图。
<强>更新强>
您可以使用以下操作方法进行测试
public ActionResult Send()
{
CreateSurveyModel model = new CreateSurveyModel();
model.Questions = new List<QuestionModel>()
{
new QuestionModel()
{
QuestionText = "1",
QuestionComment = "Comment 1",
Answers = new List<AnswerModel>()
{
new AnswerModel()
{
AnswerText = "A1",
IsCorrect = false,
},
new AnswerModel()
{
AnswerText = "A2",
IsCorrect = true,
},
new AnswerModel()
{
AnswerText = "A3",
IsCorrect = false,
},
new AnswerModel()
{
AnswerText = "A4",
IsCorrect = true,
},
}
},
new QuestionModel()
{
QuestionText = "2",
QuestionComment = "Comment 2",
Answers = new List<AnswerModel>()
{
new AnswerModel()
{
AnswerText = "A5",
IsCorrect = false,
},
new AnswerModel()
{
AnswerText = "A6",
IsCorrect = false,
},
new AnswerModel()
{
AnswerText = "A7",
IsCorrect = false,
},
new AnswerModel()
{
AnswerText = "A8",
IsCorrect = true,
},
new AnswerModel()
{
AnswerText = "A9",
IsCorrect = false,
},
}
}
};
return View(model);
}
[HttpPost]
public ActionResult Send(CreateSurveyModel model)
{
return View();
}
注意:不要忘记您应该填写一些数据供您查看。
答案 1 :(得分:0)
你可以这样做:
@using(Html.BeginForm("action", "controller", FormMethod.Post/*or FormMethod.Get*/))
{
foreach(var question in Model.Questions)
{
<!-- Question block -->
@Html.TextBoxFor("QuestionText", question.QuestionText)
<table>
@foreach(var answer in question.Answers)
{
<!-- Answer block -->
<tr>
<td>@Html.Checkbox("AnswerIsCorrect", answer.IsCorrect)</td>
<td>@Html.TextBox("AnswerText", answer.AnswerText )</td>
</tr>
<!-- Answer block END -->
}
</table>
@Html.TextBox("QuestionComment", question.QuestionComment)
<!-- Question block END -->
}
}