为每个对象创建一个复选框

本文关键字:一个 复选框 创建 对象 | 更新日期: 2023-09-27 18:22:07

我正在创建一个小型网站,允许用户创建问题和考试(以及参加这些考试)。面临创建examview的问题。必须允许用户检查应添加到考试中的任何问题。

使用以下操作创建视图,该视图通过ViewBag:中的问题

public ActionResult Create()
{
    QuestionaireDbContext db = new QuestionaireDbContext();
    ViewBag.Questions = db.Questions;
    return View();
}

在我看来,我可以调用ViewBag.Questions,并(应该能够?)使用它们为每个Questions创建复选框。

我尝试过使用HtmlHelper的外部方法CheckBoxList,这是我通过NuGet获得的。但是Html.CheckBoxList似乎没有被选中。我试着按照他们文档中的建议添加用法,但也没有成功。

我如何为每个问题创建一个复选框,并允许用户选择其中的一个变量?

我的考试和问题模型供参考:

public class Exam
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreationDate { get; set; }
    public ICollection<Question> Questions { get; set; }
}
public class Question
{
    public enum Answers
    {
        A,
        B,
        C,
        D
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public string AnswerA { get; set; }
    public string AnswerB { get; set; }
    public string AnswerC { get; set; }
    public string AnswerD { get; set; }
    public Answers Correct { get; set; }
}

为每个对象创建一个复选框

您需要创建视图模型来表示要绑定的内容。一种可能的解决方案可能是

public class ExamVM
{
  public int ID { get; set; }
  public string Name { get; set; }
  public List<QuestionVM> Questions { get; set; }
}
public class QuestionVM
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool IsSelected { get; set; }
}

在Create方法中,初始化并填充ExamVM详细信息,包括可能的问题集合,然后在视图中

@model YourAssembly.ExamVM
@using (Html.BeginForm())
{
  @Html.HiddenFor(m => m.ID)
  @Html.DisplayFor(m => m.Name)
  for (int i = 0; i < Model.Questions; i++)
  {
    @Html.HiddenFor(m => m.Questions[i].ID)
    @Html.CheckBoxFor(m => m.Questions[i].IsSelected)
    @Html.DisplayFor(m => m.Questions[i].Name)
  }
  <input type="submit" value="Save" />
}

后方法

[HttpPost]
public ActionResult Create(ExamVM model)
{
  foreach(QuestionVM q in model.Questions)
  {
    if (q.IsSelected)
    {
      // Save the value of exam.ID and question ID to the database

在Views/Shared文件夹中创建一个名为EditorTemplates的文件夹。

创建一个名为_QuestionEditor的新空视图,并添加以下代码。

@model Question
@Html.HiddenFor(model => model.Id)
@Html.DisplayFor(model => model.Name)
//use DisplayFor or LabelFor accordingly
@Html.CheckboxFor(model => true, Model.AnswerA)
@Html.CheckboxFor(model => true, Model.AnswerB)
@Html.CheckboxFor(model => true, Model.AnswerC)
@Html.CheckboxFor(model => true, Model.AnswerD)

现在在你的主视图中使用它如下

@foreach(var question in ViewBag.Questions){
    @Html.EditorFor(item => question)
    //you can specify the template name i.e `"_QuestionEditor"` as the second parameter 
    //if you have more than one editor template for the same type
}

这没有考虑您如何提交数据,因为您没有提供任何代码,也没有提供用于将数据返回到post操作的模型