经过for循环后如何返回ViewModel?

时间:2018-07-21 17:11:58

标签: c# asp.net-mvc

所以我有一个包含以下字段的ViewModel:

List<Question> questions;
List<Answer> answers;

其中Question具有一个ICollection<Answer>,每个答案均具有一个问题,即EF迁移样式。

我正在视图中显示数据,但是之后我想将其作为参数传递给后参数。 ViewModel包含以下数据: 3个问题 每个问题5个答案

我的视图如下:

@model SurveyAPI.Models.ViewModels.ShowSurveyViewModel
@using (Html.BeginForm())
{
    @for (int i = 0; i < Model.questions.Count; i++)
    {
        @Html.TextBoxFor(p => Model.questions[i].QuestionText, new { style = "font-weight : bold" })

    for (int ii = 0; ii <= Model.questions[i].Answers.Count; ii++)
    {
        @Html.HiddenFor(p => Model.answers[ii].Id)
        @Html.TextBoxFor(p => Model.answers[ii].AnswerText)
        @Html.HiddenFor(p => Model.answers[ii].Question)
    }
    <hr />
}

<input type="submit" />
}

但是我提交的不是全部。 相反,它保持:

3个问题(应如此)

5个答案(仅来自最后一个问题-我显然希望所有15个答案)。

每个答案(我收到的5个答案)都没有问题,即使该问题的“隐藏”字段中有数据。

我到底在做错什么,我该如何在后方法中接收与模型完全相同的对象?

1 个答案:

答案 0 :(得分:1)

内部循环中的输入不引用问题对象,因此它始终从0开始。它们都具有相同的名称(因为它们对每个问题都从0开始),因此仅使用外部循环的第一次迭代中的那些对象。 要修复它,内循环应该看起来像这样:

for (int ii = 0; ii <= Model.questions[i].Answers.Count; ii++)
{
    @Html.HiddenFor(p => p.questions[i].Answers[ii].Id)
    @Html.TextBoxFor(p => p.questions[i].Answers[ii].AnswerText)
    @Html.HiddenFor(p => p.questions[i].Answers[ii].Question)
}

每个HiddenFor和TextBoxFor应该都具有参考问题[i],因此输入名称将变得唯一并准确地张贴。

如果您要为问题和答案提供单独的属性,则内部循环变量不能从0开始,例如,它应如下所示:

@{ int index = 0; }
@for (int i = 0; i < Model.questions.Count; i++)
{
    @Html.TextBoxFor(p => Model.questions[i].QuestionText, new { style = "font-weight : bold" })

    for (int ii = 0; ii <= Model.questions[i].Answers.Count; ii++, index++)
    {
        @Html.HiddenFor(p => Model.answers[index].Id)
        @Html.TextBoxFor(p => Model.answers[index].AnswerText)
        @Html.HiddenFor(p => Model.answers[index].Question)
    }
    <hr />
}