MVC模型在帖子上为空

时间:2015-10-28 16:36:21

标签: c# asp.net-mvc asp.net-mvc-4

我的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>

2 个答案:

答案 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帮助器不知道它在数组中的位置,并且名称没有正确构建。