C# MVC模型绑定到列表-仅适用于列表中的第一项

C# MVC模型绑定到列表-仅适用于列表中的第一项,c#,asp.net-mvc,list,binding,model,C#,Asp.net Mvc,List,Binding,Model,我有一个包含多个表单的页面,可以编辑单个测验的问题,每个问题都有自己的答案列表。因此,对于本测验中的每个问题,都有一个表单,用户可以编辑该表单中的问题(和答案),请参见以下内容: @model OLTINT.Areas.admin.ViewModels.OldQuizQAViewModel <h1>Edit @Model.QuizTitle quiz</h1> <hr /> <p class="breadcrumb"> @Html.Acti

我有一个包含多个表单的页面,可以编辑单个测验的问题,每个问题都有自己的答案列表。因此,对于本测验中的每个问题,都有一个表单,用户可以编辑该表单中的问题(和答案),请参见以下内容:

@model OLTINT.Areas.admin.ViewModels.OldQuizQAViewModel
<h1>Edit @Model.QuizTitle quiz</h1>
<hr />
<p class="breadcrumb">
    @Html.ActionLink(HttpUtility.HtmlDecode("&#9668;") + " Back to List", "Quizzes", new { id = Model.CourseID }, new { @class = "" })
</p>
@for (int j = 0; j < Model.OldQuizQuestions.Count(); j++)
{
    using (Ajax.BeginForm("EditQuiz", "Course", null, new AjaxOptions
    {
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "button"
    }))
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(model => model.QuizID)
        @Html.HiddenFor(model => model.OldQuizQuestions[j].QuizQuestionID)

        <p class="form_title">Question number @Model.OldQuizQuestions[j].Order</p>
        <div class="resize_input">@Html.EditorFor(model => model.OldQuizQuestions[j].Question)</div>
        <p class="form_title">@Html.LabelFor(model => model.OldQuizQuestions[j].Type)</p>
        <div class="resize_input">@Html.DropDownListFor(model => model.OldQuizQuestions[j].Type, ViewBag.types, "Please choose...", new { @class = "chosen-select" })</div>

        <p class="form_title">Choose correct answers</p>
        Char x = 'a';
        for (int i = 0; i < Model.OldQuizQuestions[j].OldQuizAnswers.Count(); i++)
        {
            x++;
            if (i == 0)
            {
                x = 'a';
            }
            <div style="display:table; width:100%;">
                <div class="divTableCell" style="padding:0 10px 10px 0; vertical-align:middle; min-width:6%;">
                    @Html.CheckBoxFor(model => model.OldQuizQuestions[j].OldQuizAnswers[i].Correct, new { style = "" })
                    @Html.LabelFor(model => model.OldQuizQuestions[j].OldQuizAnswers[i].Correct, "["+ x +"]")
                </div>
                <div class="divTableCell quiz_input">
                    @Html.HiddenFor(model => model.OldQuizQuestions[j].OldQuizAnswers[i].QuizAnsID)
                    @Html.EditorFor(model => model.OldQuizQuestions[j].OldQuizAnswers[i].Answer)
                </div>
            </div>
        }
        <div class="button_container">
            <p id="button"></p>
            @Html.ActionLink("Delete this question", "DeleteQuestion", new { id = Model.OldQuizQuestions[j].QuizQuestionID }, new { @class = "button button_red button_not_full_width" })
            <input type="submit" value="Save" class="button button_orange button_not_full_width" />
        </div>
        <hr />
    }
}
控制器:

public class OldQuizQAViewModel
{
    public int CourseID { get; set; }
    public int? QuizID { get; set; }
    public string QuizTitle { get; set; }
    public IList<OldQuizQuestions> OldQuizQuestions { get; set; }
}
public class OldQuizQuestions
{
    [Key]
    public int QuizQuestionID { get; set; }
    public int OldQuizID { get; set; }
    [Required]
    public string Question { get; set; }
    [Required]
    public int Order { get; set; }
    [Required]
    public int Type { get; set; }

    public virtual IList<OldQuizAnswers> OldQuizAnswers { get; set; }
    public virtual OldQuiz OldQuiz { get; set; }

}
public class OldQuizAnswers
{
    [Key]
    public int QuizAnsID { get; set; }
    public int QuizQuestionID { get; set; }
    public string Answer { get; set; }
    public int Order { get; set; }
    public bool Correct { get; set; }
    public bool Chosen { get; set; }

    public virtual OldQuizQuestions OldQuizQuestions { get; set; }
}
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EditQuiz(OldQuizQAViewModel model)
    {
        var questiondata = model.OldQuizQuestions.Single();

        if (ModelState.IsValid)
        {
            OldQuizQuestions updatequestion = db.OldQuizQuestions
                .SingleOrDefault(x => x.QuizQuestionID == questiondata.QuizQuestionID);

            updatequestion.Question = questiondata.Question;
            updatequestion.Type = questiondata.Type;

            db.Entry(updatequestion).State = EntityState.Modified;
            db.SaveChanges();

            foreach (var answer in questiondata.OldQuizAnswers)
            {
                var updateanswer = updatequestion.OldQuizAnswers
                    .First(x => x.QuizAnsID == answer.QuizAnsID);

                updateanswer.Answer = answer.Answer;
                updateanswer.Correct = answer.Correct;

                db.Entry(updateanswer).State = EntityState.Modified;
                db.SaveChanges();
            }

            return Content("<span style='font-weight:300; font-size:1.2em; color: green; '>Saved!</span>");
        }
        return Content("<span class='errortext'>Please correct the marked fields!</span>");
    }
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果编辑测验(OldQuizQAViewModel)
{
var questiondata=model.OldQuizQuestions.Single();
if(ModelState.IsValid)
{
OldQuizQuestions updatequestion=db.OldQuizQuestions
.SingleOrDefault(x=>x.QuizQuestionID==questiondata.QuizQuestionID);
updatequestion.Question=questiondata.Question;
updatequestion.Type=questiondata.Type;
db.Entry(updatequestion).State=EntityState.Modified;
db.SaveChanges();
foreach(问题数据中的var答案。OldQuizAnswers)
{
var updateanswer=updatequestion.OldQuizAnswers
.First(x=>x.QuizAnsID==answer.QuizAnsID);
updateanswer.Answer=Answer.Answer;
updateanswer.Correct=答案.Correct;
db.Entry(updateanswer.State=EntityState.Modified;
db.SaveChanges();
}
返回内容(“已保存!”);
}
返回内容(“请更正标记的字段!”);
}
现在,如果我想编辑第一个问题,这很好,但是当我编辑任何其他问题时,我的控制器只会说null,但当我检查正在发布的数据时,所有内容都在那里(例如,当我尝试编辑问题2时):


我在这里查看了很多关于模型绑定到列表的查询,但是没有一个有帮助。有人知道我在这方面出了什么问题吗?

多重形式有什么意义。一次只能提交一份表格。只要有一个表单(里面有循环),就可以正常工作。默认情况下,
DefaultModelBinder
将仅绑定索引器开始、为零且连续的集合,因此,唯一符合这一点的表单是第一个。@StephenMuecke重点是,我不希望每次用户编辑某个内容时提交10个问题的数据,但要感谢。然后,通过链接和编辑页面一次编辑一个问题。您当前的实现永远无法工作,它是一个令人困惑的UI,而且很差performance@StephenMuecke此UI是专门要求的。因此,较差的用户编辑一个问题,然后再编辑另一个问题,然后点击“提交”按钮,结果发现只有一个编辑被提交,而且他们也不会更明智(假设您进行了更改以使其生效)