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

时间:2014-09-17 10:40:09

标签: c# asp.net-mvc entity-framework

我正在创建一个小网站,允许用户创建问题和考试(并参加考试)。面对Create-examview的问题。必须允许用户检查应添加到考试中的任何问题。

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

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

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

我尝试过使用extesionmethod来获取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; }
}

2 个答案:

答案 0 :(得分:0)

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

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

在您创建方法中,初始化并填充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

答案 1 :(得分:0)

在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操作的模型