gpt4 book ai didi

c# - MVC 模型绑定(bind)到列表 - 仅适用于列表中的第一项

转载 作者:行者123 更新时间:2023-12-04 17:52:23 30 4
gpt4 key购买 nike

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

@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 />
}
}

OldQuizQAViewModel:

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; }
}

Controller :

    [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>");
}

现在,如果我想编辑第一个问题,这就可以正常工作了,但是当我编辑其他任何内容时,我的 Controller 只是说 null 但是当我检查正在发布的数据时,一切都在那里(例如,当我尝试编辑问题 2 时):

enter image description here

我在这里查看了很多关于模型绑定(bind)到列表的查询,但都没有帮助。谁能看出我哪里出了问题?

最佳答案

您面临的问题是由于误解了 asp.net 模型绑定(bind)如何与列表相关的。例如,查看 Controller 操作 EditQuiz 中使用的 View 模型。

public class OldQuizQAViewModel
{
public int CourseID { get; set; }
public int? QuizID { get; set; }
public string QuizTitle { get; set; }
public IList<OldQuizQuestions> OldQuizQuestions { get; set; }
}

为了使模型绑定(bind)与 IList 或任何其他集合一起使用,asp-net 期望您发布的表单数据具有顺序索引。您通过 POST 发送的表单数据已经有一个模型绑定(bind)与实现的集合的工作示例。查看表单数据:

Form Data

突出显示的属性显示了如何正确绑定(bind)到集合,因为您在 OldQuizQAViewModel 中为 IList 的每个索引设置 OldQuizAnswers 模型中的属性 Correct 的值,并在单个请求中一次传递所有这些值。

而在同一个请求中,您只传递特定索引的 OldQuizQuestions 的数据,您希望这些值绑定(bind)到 IList 集合中。

这就是为什么您第一次发布时模型绑定(bind)成功,因为您引用了第一个索引 ([0]),而在第二次 POST 中您引用了第二个索引 ( 1 ) 而不是第一个,导致模型绑定(bind)失败。

参见 here有关模型绑定(bind)如何工作的更多信息。

关于c# - MVC 模型绑定(bind)到列表 - 仅适用于列表中的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43637912/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com