我的viewmodel在GET上运行正常,但在帖子上它是null,我无法理解为什么。任何帮助将不胜感激。测验岗位在这个阶段做得不多,我需要在完成方法之前访问已发布的模型。 repository.GetAllQuestionsList()返回QuizViewModel
列表视图模型
public class QuizViewModel {
public int Id { get; set; }
public int QuestionId { get; set; }
public string QuestionText { get; set; }
public int QuestionNbr { get; set; }
public int CurrentQuestion { get; set; }
public int TotalNbrOfQuestions { get; set; }
public List<Answer> Answers { get; set; }
}
控制器
public ActionResult Quiz() {
var getAllQuestions = repository.GetAllQuestionsList();
var model = getAllQuestions.Where(c => c.QuestionNbr == 1);
Session["CurrentQ"] = 1;
return View(model);
}
[HttpPost]
public ActionResult Quiz(IEnumerable<Models.QuizViewModel> model) {
int question = Convert.ToInt32(Session["CurrentQ"]);
string str = Request.Params["btnSubmit"];
if (str == "Next Question") {
question++;
Session["CurrentQ"] = question;
}
if (str == "Prev Question") {
question--;
Session["CurrentQ"] = question;
}
return View(model);
}
查看
@model IEnumerable<Quiz.Models.QuizViewModel>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Quiz</title>
</head>
<body>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm()) {
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.QuestionText)
</th>
<th>
@Html.DisplayNameFor(model => model.QuestionNbr)
</th>
<th>
answer
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.QuestionText)
</td>
<td>
@Html.DisplayFor(modelItem => item.QuestionNbr)
</td>
<td>
@foreach (var ML in item.Answers) {
@Html.RadioButtonFor(model => item.Answers, ML.Id)
@Html.Label(ML.AnswerText)
<br/>
}
</td>
</tr>
}
</table>
<input type="submit" id="Submit1" name="btnSubmit" value="Prev Question"/>
<input type="submit" id="Submit2" name="btnSubmit" value="Next Question"/>
}
</body>
</html>
答案 0 :(得分:2)
我不认为你的代码会工作,因为名称绑定也没有正确生成@Html.DisplayNameFor(model => model.QuestionText)
和@Html.DisplayNameFor(model => model.QuestionNbr)
将抛出异常,因为Model的类型为IEnumerable。只有当名称是输入控件时,HttpPost绑定才能在生成的html中生成,当发布到服务器时。我已经更正了你的代码。请参阅下面的
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Quiz</title>
</head>
<body>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm()) {
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model[0].QuestionText)
</th>
<th>
@Html.DisplayNameFor(model => model[0].QuestionNbr)
</th>
<th>
answer
</th>
<th></th>
</tr>
@for (int index = 0; index > Model.Count; index++) {
<tr>
<td>
@Html.DisplayFor(modelItem => modelItem[index].QuestionText)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[index].QuestionNbr)
</td>
<td>
@for (int jIndex = 0; jIndex < Model[index].Answers; jIndex++ ) {
@Html.RadioButtonFor(model => modelItem[index].Answers[jIndex].Answer, modelItem[index].Answers[jIndex].Id)
@Html.Label(modelItem[index].Answers[jIndex].AnswerText)
<br/>
}
</td>
</tr>
}
</table>
<input type="submit" id="Submit1" name="btnSubmit" value="Prev Question"/>
<input type="submit" id="Submit2" name="btnSubmit" value="Next Question"/>
}
</body>
</html>
答案 1 :(得分:1)
忽略@Html.DisplayNameFor(model => model.QuestionText)
(正如我所说的那样没有意义)。您只需要更改迭代器,以便它知道项目所在的数组中的位置,即
@for (int i = 0; i < Model.Count; i++) {
<tr>
<td>
@Html.DisplayFor(modelItem => modelItem[i].QuestionText)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].QuestionNbr)
</td>
..... etc
}
foreach
在MVC视图中不能很好地工作,因为HTML帮助器不知道它在数组中的位置,并且名称没有正确构建。